Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] debugging without stopping server

Hi Simone,

Thanks for spending time to explain it. : )

But I think there is still something I do not understand very well and want to make it clear. 

In fact, I have successfully get load-time weaving example worked (http://www.nabble.com/Load-time-weaving-problem-tt19347338.html#a19357654). So I think I have some basic ideas about how load-time weaving processes. However, it looks like it is based on each time when a new jvm is launched (via executing `java -javaagent:...`), weaving aspect to the target classes. Now suppose if I have a server already running, it may execute command like 'java -classpath ....' or 'java -javaagent:...' (all is based on jdk 5.0 or higher version). If I want to capture/ trace information as you described below, what should I do in order to achieve it without stopping the server? 

For instance, I programme a mock server which only prints count on the screen (source is as A). How can I hook my aspect to capture when counter is equals to 7 (Then do something defined in the aspect like tracing or log value to somewhere, etc.) I completely have no idea about this (As I understand is this is run-time/ online weaving, which aspectj does not support, but aspectwerkz does, which now is merged with aspectj.) Would you please to give me a bit more explain on this (or some steps to perform this)? Or kindly pointing me where there contains such document for aspectj. 

I sincerely appreciate your help.

A.)
package sys;

public class Server{
        private static int count = 0;

        private synchronized void start(){
                try{
                        while(true){
                                System.out.println("count:"+count);
                                count++;
                                new Thread().sleep(1000);
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }
        }

        public static void main(String args[]){
                new Server().start();
        }
}



--- On Sat, 13/9/08, Simone Gianni <simoneg@xxxxxxxxxx> wrote:

> From: Simone Gianni <simoneg@xxxxxxxxxx>
> Subject: Re: [aspectj-users] debugging without stopping server
> To: aspectj-users@xxxxxxxxxxx
> Date: Saturday, 13 September, 2008, 12:32 PM
> Hi Neo,
> yes, I think you are confused. AspectWerkz merged with
> AspectJ. What you
> are searching is not dependent on Load Time Weaving
> directly, what you
> are searching for is a tracing aspect.
> 
> Basically your need is :
>  - Find out which parameters were passed to each a certain
> function when
> it throws an exception
>  - Log it somewhere, so that proper action can be taken
>  - So, eliminate the need to stop the server, restart it in
> debug mode,
> place the breakpoint, look at those params, restart the
> server in normal
> mode again.
> 
> This is perfectly possible, and easy, using AspectJ. A
> simple aspect
> like this will do the job, and can easily be expanded to
> further support
> your needs.
> 
> Suppose you have the following class :
> 
> public class MyDAO {
>   public void doStuffOnDb(String functionName, int
> parameter) throws
> SQLException {
>     // call the stored procedure, do stuff on the DB
>   }
> }
> 
> You can add an aspect like this :
> 
> public aspect TraceParamatersOnException {
>   // A pointcut
>   pointcut dbFunction() : execution(MyDao.doStuffOnDb(..));
> 
>   // An advice that takes arguments and log them
>   after() throwing (SQLException e) : doStuffOnDb() {
>     Object[] args = thisJoinPoint.getArgs();
>     Logger.getLogger(...).log(.....); //Compose a string
> here using your
> preferred loggin system
>   }
> }
> 
> And that is it. Obviously, you can extend the aspect
> changing the
> pointcut to catch more methods, all the methods in a class,
> all the
> methods throwing SQLException, all the methods in all
> classes in a
> certain package and so on using the flexible pointcut
> syntax provided by
> AspectJ.
> 
> Once your aspect is written, you have then to
> "incorporate" it in your
> project. This step is called "weaving".
> Basically, AspectJ will take
> your classes (either java sources, or already compiled
> .class) on one
> side, your aspects on the other, and modify your classes so
> that proper
> advice is executed when an SQLException is thrown.
> 
> Weaving can be done in a number of ways. If you are writing
> an aspect
> that will intercept only classes pertaining to your project
> (classes on
> which you have complete control), then maybe compile time
> weaving is a
> good choice : you can use ANT or Maven or call the Ajc
> compiler by hand
> to weave your classes, then package them as usual in a WAR
> or in a JAR
> and use them as if nothing special is there.
> 
> I do prefer load time weaving, because it resolves a number
> of problems
> common to compile time weaving, like an aspect having to
> intercept
> classes from different jars and stuff like that. Also, I
> find it
> incredibly simple to use. This decision however is not
> connected to
> "programming an aspect", but it's more a
> "deploy" style decision, so
> should be taken by who cares about that part of the process
> in your
> organization. The decision could finally depend on other
> requirements,
> like the target application server.
> 
> If load time weaving is in place (in it's simplest
> form, it consist of
> running the JVM with the AspectJ javaagent), then you can
> simply write
> your aspects in eclipse (installing AJDT, which will
> provide eclipse
> plugins for aspects), pack them in a jar (AJDT has an
> option to do this
> automatically from eclipse), put the jar in the WEB-INF/lib
> of your WAR
> or web application and that's it, nothing more
> required.
> 
> The nice thing about AOP, is that you can write even
> complex and "heavy"
> aspects, but once all the possible causes of exceptions are
> eliminated
> and the code is stable, simply removing the JAR containing
> aspects from
> the web application will effectively remove the additional
> logging
> without touching the application code itself.
> 
> Hope this clarified it a bit, I know that the first part of
> the learning
> curve is a bit hard to escalate.
> 
> Simone
> 
> Neo Anderson wrote:
> > Yes, basically the feature I want is to capture the
> message/ error whilst system is still running. For instance,
> we have a legacy system based on rmi, which uses store
> procedure to perform insert, update, delete actions against
> database. The bitter problem I encountered is each time when
> there is an error, usually it only throws error like
> 'ORA-xxxx something goes wrong' with stack trace. 
> Even I have source and can see exactly what lines the code
> are at when error occurred, nothing I can do to solve the
> problem because I do not know what parameters passed in
> whilst execution (logs sometime just do not help too much
> and we can not modify the source code; or sometimes it is
> urgent, but we still can not shutdown the server.)  So if I
> am able to monitor the exactly value used whilst the system
> goes wrong, that definitively would help me a lot. 
> >
> > But due to I am new to AOP, the more document I read,
> the more confused I am. Originally I thought aspectj's
> load-time weaving is what I want. However, after reading
> some document, it seems like the load-time weaving is
> different from run-time/ online weaving (aspectwerkz) and
> dynamic AOP (JBoss AOP), which is the feature that aspectj
> does not support.  So I switch to learn aspectwerkz.
> Interestingly, in the mailing list, I saw someone says that
> since the aspectj and aspectwerkz are merged. Users should
> use aspectj 5 instead of using aspectwerkz for such feature.
>  I believe I might misunderstand something, but I can't
> distinguish based on my limited knowledge on AOP.   Would
> you or anyone please to give me a bit more explain about
> this?  
> >
> > I appreciate any help.
> >
> > Thank you very much.
> >
> > --- On Wed, 10/9/08, Andrew Eisenberg
> <andrew@xxxxxxxxxxxx> wrote:
> >
> >   
> >> From: Andrew Eisenberg <andrew@xxxxxxxxxxxx>
> >> Subject: Re: [aspectj-users] debugging without
> stopping server
> >> To: javadeveloper999@xxxxxxxxxxx,
> aspectj-users@xxxxxxxxxxx
> >> Date: Wednesday, 10 September, 2008, 3:32 PM
> >> Are you saying that you want to use AspectJ to
> monitor an
> >> application
> >> and notify you when there is a failure?  You
> cannot use
> >> AspectJ to
> >> debug your application.  You can, however, use
> AspectJ to
> >> help gather
> >> state about your application at the time of the
> failure.
> >>
> >> There is a first failure data capture (FFDC)
> pattern that
> >> you can use.
> >>
> http://blog.springsource.com/main/2008/01/07/capturing-failures-and-system-state-part-i/
> >>
> >> As for adding aspects to an already running system
> on a
> >> server
> >> (without stopping it), that might be difficult
> depending on
> >> the kind
> >> of server that you are running.  OSGi based
> servers are
> >> built to allow
> >> this kind of thing to happen.
> >>
> >> On Wed, Sep 10, 2008 at 2:01 AM, Neo Anderson
> >> <javadeveloper999@xxxxxxxxxxx> wrote:
> >>     
> >>> Is it possible for aspectj to debug
> application or
> >>>       
> >> project running on the server without stopping the
> service?
> >>     
> >>> For instance, suppose I have an application
> providing
> >>>       
> >> service and the application also talks to the
> backend
> >> database. Sometime it might throw error (not
> server crash),
> >> but we can not stop it. I check the doc and it
> looks like
> >> load-time weaving can be used for this purpose,
> but I have
> >> no idea how to do that. Would anyone please
> provide senario
> >> or any good tutorial/ example about this?
> >>     
> >>> Thanks in advice,
> >>>
> >>>
> >>>
> >>>
> _______________________________________________
> >>> aspectj-users mailing list
> >>> aspectj-users@xxxxxxxxxxx
> >>>
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>>
> >>>       
> >
> >
> >       
> > _______________________________________________
> > aspectj-users mailing list
> > aspectj-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >   
> 
> 
> -- 
> Simone Gianni            CEO Semeru s.r.l.           Apache
> Committer
> MALE human being programming a computer  
> http://www.simonegianni.it/
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users





Back to the top