1 2 Previous Next 15 Replies Latest reply: Jun 20, 2011 1:25 AM by Przemysław Chmielewski RSS

Deploy AOP to jboss 5.1

Karen Greene Newbie

Hi,

I am trying to get my aop deployed to jboss 5.1. I have written an annotation, aspect, and jboss-aop.xml. I have verified that the aspect code gets executed when a method is annotated with the JobFlow annotation through eclipse.

However, when deploying the code to jboss, the annotation has no effect.

I did the following to deploy the aop:
1. jar up the annotation and aspect into a jar file and deploy it to farm
2. deploy the jboss-aop.xml and deploy it to farm
3. set enableLoadtimeWeaving in aop.xml to true
4. copied pluggable-instrumentor.jar to the bin directory and modified run.sh to include -javaagent:pluggable-instrumentor.jar

Then I also deployed as a separate jar class that use the annotations. However, the aop is not being applied.

I can run a test outside of jboss that has the annotation and see that the aop is being applied.

Can someone tell me what I am doing wrong?

Here is the jboss-aop.xml:

<?xml version="1.0" encoding="UTF-8"?>
<aop xmlns="urn:jboss:aop-beans:1.0">
 <aspect class="com.jpmc.etl.jobflow.aspect.JobFlowAspect" scope="PER_VM"/>

 <bind pointcut="execution(* *->@com.jpmc.etl.jobflow.aspect.JobFlow(..))">
 <advice name="executeFlow"
 aspect="com.jpmc.etl.jobflow.aspect.JobFlowAspect"/>
 </bind>
</aop>



  • 1. Re: Deploy AOP to jboss 5.1
    Kabir Khan Master

    You need to deploy the aspects and -aop.xml before you deploy your application. You might already be doing this, but you did not mention it.

    It sounds like you have loadtime weaving set up correctly, but try the 'injboss' tutorial example that comes with the AOP download to verify.

  • 2. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Thanks for the quick response. Yes. I did deploy the aspects and aop before the application.

    I tried to find the injboss tutorial earlier and downloaded jboss-aop-2.1.3.GA.zip, but could not find it. Is there something else I need to download?

  • 3. Re: Deploy AOP to jboss 5.1
    Kabir Khan Master

    jboss-aop-2.1.3.zip/docs/aspect-framework/examples/injboss

  • 4. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Ok, I deployed docs\aspect-framework\examples\injboss example using deploy-basic-lt-war. When I bring up index.jsp I get the following the errors below indicating the SimpleInterceptor class cannot be found even though I can look at the jar inside the war and can see the class.

    At any rate, it appears that jboss is trying to at least apply the aop. I have AspectManager verbose set to true. I understand that this is supposed to output info when aop is applied. When I deploy my jars that use the aop, there is absolutely no output. I don't think jboss is applying the aop in the code I am deploying (in that I see that there is output in the errors regarding joinpoints). I really appreciate your help as I have trying to resolve this issue for a couple days and cannot determine I am doing wrong.

    I have a JobFlow.jar that includes:

    - JobFlow.java
    - JobFlowAspect.java
    - A few additional classes the aspect uses


    I have a jboss-aop.xml that indicates to call the JobFlowAspect whenever the JobFlow annotation is used on a method

    I have another jar that includes a classes that use the JobFlow annotation on the method.

    I deployed the JobFlow.jar and jboss-aop.xml to farm, then I deploy the jars that use the annotation. When I deploy the jars that use the annotation there is no output that the aspect is being applied.

    Here is the JobFlow and JobFlowAspect (Note that I deleted most of the logic in the aspect class for brevity sake). I also tried annotations instead of jboss-aop.xml, but that did not work either.
    
    
    Here is JobFlow.java
    
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JobFlow {}
    
    
    Here is JobFlowAspect.java
    //@Aspect(scope = Scope.PER_VM)
    public class JobFlowAspect
    {
    
     private static Logger log = Logger.getLogger(JobFlowAspect.class);
     //@Bind(pointcut="execution(* *->@com.jpmc.etl.jobflow.aspect.JobFlow(..))")
    
     public Object executeFlow(MethodInvocation invocation) throws Throwable
     {
    
     try
     {
     System.out.println("JobFlowAspect: Calling method " + invocation.getMethod().getName());
    
     return invocation.invokeNext();
     }
     finally
     {
    
    
     System.out.println("JobFlowAspect: Done");
    
     }
     }
    }
    
    

    =========== Here is the output I get from deploying the injboss example ====

    org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 7

    root cause

    java.lang.RuntimeException: Error generating joinpoint class for joinpoint Method[method=public java.lang.String org.jboss.injbossaop.lib.ExampleValue.getMessage()]

    java.lang.RuntimeException: java.lang.ClassNotFoundException: org.jboss.injbossaop.lib.SimpleInterceptor


  • 5. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Please ignore the previous post as there was a statement that was incorrect.


    Ok, I deployed docs\aspect-framework\examples\injboss example using deploy-basic-lt-war. When I bring up index.jsp I get the following the errors below indicating the SimpleInterceptor class cannot be found even though I can look at the jar inside the war and can see the class.

    At any rate, it appears that jboss is trying to at least apply the aop (in that I see that there is output in the errors regarding joinpoints).

    I have AspectManager verbose set to true. I understand that this is supposed to output info when aop is applied. When I deploy my jars that use the aop, there is absolutely no output. I don't think jboss is applying the aop in the code I am deploying . I really appreciate your help as I have trying to resolve this issue for a couple days and cannot determine I am doing wrong.

    I have a JobFlow.jar that includes:

    - JobFlow.java
    - JobFlowAspect.java
    - A few additional classes the aspect uses


    I have a jboss-aop.xml that indicates to call the JobFlowAspect whenever the JobFlow annotation is used on a method

    I have another jar that includes a classes that use the JobFlow annotation on the method.

    I deployed the JobFlow.jar and jboss-aop.xml to farm, then I deploy the jars that use the annotation. When I deploy the jars that use the annotation there is no output that the aspect is being applied.

    Here is the JobFlow and JobFlowAspect (Note that I deleted most of the logic in the aspect class for
     brevity sake). I also tried annotations instead of jboss-aop.xml, but that did not work either.
    
    
    Here is JobFlow.java
    
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JobFlow {}
    
    
    Here is JobFlowAspect.java
    //@Aspect(scope = Scope.PER_VM)
    public class JobFlowAspect
    {
    
     private static Logger log = Logger.getLogger(JobFlowAspect.class);
     //@Bind(pointcut="execution(* *->@com.jpmc.etl.jobflow.aspect.JobFlow(..))")
    
     public Object executeFlow(MethodInvocation invocation) throws Throwable
     {
    
     try
     {
     System.out.println("JobFlowAspect: Calling method " + invocation.getMethod().getName());
    
     return invocation.invokeNext();
     }
     finally
     {
    
    
     System.out.println("JobFlowAspect: Done");
    
     }
     }
    }
    
    


    =========== Here is the output I get from deploying the injboss example ====

    org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 7

    root cause

    java.lang.RuntimeException: Error generating joinpoint class for joinpoint Method[method=public java.lang.String org.jboss.injbossaop.lib.ExampleValue.getMessage()]

    java.lang.RuntimeException: java.lang.ClassNotFoundException: org.jboss.injbossaop.lib.SimpleInterceptor



  • 6. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    I resolved the classnotfound error. The aop is being applied to the injbossaop example as I see the output below.

    Still trying to figure out why the aop for my classes are not being applied. Is there something different that needs to be done if the aop is being triggered via an annotation? If you have any insights, it would be most appreciated. The annotation, aspect and jboss-aop.xml is in previous replies.


    17:52:19,670 INFO [STDOUT] **** ExampleValue empty Constructor
    17:52:19,717 INFO [STDOUT] <<< Entering SimpleInterceptor:
    invocation class: org.jboss.injbossaop.lib.JoinPoint_getMessage5353407034680111516_1
    type: Method Invocation
    method: getMessage
    Class containing method: org.jboss.injbossaop.lib.ExampleValue
    17:52:19,717 INFO [STDOUT] **** ExampleValue.getMessage()
    17:52:19,717 INFO [STDOUT] >>> Leaving SimpleInterceptor
    17:54:08,753 INFO [STDOUT] <<< Entering SimpleInterceptor:
    invocation class: org.jboss.injbossaop.web.JoinPoint_service8586428322187484014_2
    type: Method Invocation
    method: service
    Class containing method: org.jboss.injbossaop.web.BasicExampleServlet
    17:54:08,769 INFO [STDOUT] **** BasicExampleServlet.service()
    17:54:08,816 INFO [STDOUT] <<< Entering SimpleInterceptor:
    invocation class: org.jboss.injbossaop.lib.JoinPoint_constructor_ExampleValue_1_3
    type: Constructor Invocation
    constructor: public org.jboss.injbossaop.lib.ExampleValue(java.lang.String)
    17:54:08,816 INFO [STDOUT] **** ExampleValue String Constructor
    17:54:08,816 INFO [STDOUT] >>> Leaving SimpleInterceptor
    17:54:08,910 INFO [STDOUT] <<< Entering SimpleInterceptor:
    invocation class: org.jboss.injbossaop.lib.JoinPoint_getMessage5353407034680111516_1
    type: Method Invocation
    method: getMessage
    Class containing method: org.jboss.injbossaop.lib.ExampleValue
    17:54:08,910 INFO [STDOUT] **** ExampleValue.getMessage()
    17:54:08,910 INFO [STDOUT] >>> Leaving SimpleInterceptor
    17:54:08,910 INFO [STDOUT] >>> Leaving SimpleInterceptor

  • 7. Re: Deploy AOP to jboss 5.1
    Kabir Khan Master

     

    "kgreenejpmc" wrote:
    Is there something different that needs to be done if the aop is being triggered via an annotation?


    If you mean using @Aspect, @Bind etc., the classes need to be in an .aop file.

    If you mean using annotations in your pointcuts, nothing special is needed. If you only remembered to add the @Retention to your @JobFlow annotation after annotating your classes with @JobFlow you should clean and recompile all the classes so the annotation gets reapplied.




  • 8. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Ok, after quite a bit of trial and error I finally got the aop to work. However, I have a question.

    If I put my @JobFlow annotation on the onMessage method, the aop does not work. However, If I put the @JobFlow annotation on the processMessage method (which onMessage calls), the aop works. Does jboss suppress or ignore custom annotations on onMessage? If so, is there a way to enable them to work on onMessage?

    @MessageDriven(activationConfig = {
     @ActivationConfigProperty(propertyName="maxMessages", propertyValue="1"),
     @ActivationConfigProperty(propertyName="maxSession", propertyValue="3"),
     @ActivationConfigProperty(propertyName="dLQMaxResent", propertyValue="1"),
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/TestConsumer1")
    })
    @Clustered
    public class TestConsumer1 implements MessageListener {
    
    
    
    
     private static Logger log = Logger.getLogger(TestConsumer1.class);
    
     @Resource
     private MessageDrivenContext context;
    
    
    
     //put @JobFlow here does not work. The aop does not get called
     public void onMessage(Message msg) {
     log.info("Got message.");
    
    
     try
     {
     processMessage(msg);
     TextMessage txtMsg = (TextMessage)msg;
     String stagingPath = txtMsg.getText();
    
     log.info("FlowId: " + MessageProperties.getFlowId(msg));
     log.info("JobId: " + MessageProperties.getJobId(msg));
     log.info("PrevStageId: " + MessageProperties.getPrevStageId(msg));
    
     }
     catch (Exception e)
     {
     context.setRollbackOnly();
    
     }
    
    
     log.info("DONE!");
     }
    
    
     //putting @JobFlow here works and the aop is called
     @JobFlow
     public void processMessage(Message msg)
     {
     log.info("Running processMessage");
     }
    
    }
    


  • 9. Re: Deploy AOP to jboss 5.1
    Kabir Khan Master

    If you want to intercept onMessage() only, you're probably better off creating a custom AOP domain for message driven beans (see deploy/ejb3-interceptors-aop.xml for examples of how to do this) and to use the @AspectDomain annotation on your message driven beans where you want this behaviour. This will avoid the need for weaving your classes. There should be some examples on how to do this in the ejb 3 documentation or user forum.

    Regarding your question, it "should work" for onMessage(), but I am not sure how ejb3 interacts with woven classes, and since EJB3 uses AOP to configure itself, there might be some problem with aspects on EJB 3 business methods.

  • 10. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Thanks for the feedback. I have another question.

    On discovering that the @JobFlow does not work on onMessage, I was very curious as to how annotations such as @TransactionAttribute work on onMessage (as well as other methods). These types of annotations don't seem to require loadtime weaving. In addition, you don't have to do anything special when you compile your classes that use these annotations (which leads me to believe that compile time weaving is not required either).

    I did quite a bit of digging and discovered it might have to do with proxies, but I am not sure. I looked at the jboss source code, but did not see anything special in TransactionAttributeImpl.java

    I am interested in developing my custom annotation and aspect such that it works like the @TransactionAttribute in that it does not require load time weaving and you don't have to compile your classes in any special way.

    Am I correct in assuming that annotations such as @TransactionAttribute don't use compile time or loadtime weaving? If so, could you point me to some sources that would explain how the the code behind the annotation is triggered and executed?



  • 11. Re: Deploy AOP to jboss 5.1
    Karen Greene Newbie

    Thanks for the feedback. I have another question.

    On discovering that the @JobFlow does not work on onMessage, I was very curious as to how annotations such as @TransactionAttribute work on onMessage (as well as other methods). These types of annotations don't seem to require loadtime weaving. In addition, you don't have to do anything special when you compile your classes that use these annotations (which leads me to believe that compile time weaving is not required either).

    I did quite a bit of digging and discovered it might have to do with proxies, but I am not sure. I looked at the jboss source code, but did not see anything special in TransactionAttributeImpl.java

    I am interested in developing my custom annotation and aspect such that it works like the @TransactionAttribute in that it does not require load time weaving and you don't have to compile your classes in any special way.

    Am I correct in assuming that annotations such as @TransactionAttribute don't use compile time or loadtime weaving? If so, could you point me to some sources that would explain how the the code behind the annotation is triggered and executed?

  • 12. Re: Deploy AOP to jboss 5.1
    Kabir Khan Master

    Correct, if you deploy an EJB 3 bean it constructs an EJB container without weaving. The configuration for these containers is in ejb3-interceptors-aop.xml. Calls to the ejb are done via the container and go through the stack of interceptors before hitting the ejb.


    For example, if you deploy a stateless session bean it will use the

    <domain name="Stateless Bean" extends="Intercepted Bean" inheritBindings="true">
    


    which uses pointcuts to apply the different interceptors that make up the container. e.g. the
     <interceptor-ref name="org.jboss.ejb3.tx.CMTTxInterceptorFactory"/>
    

    looks for the TransactionAttribute annotations on the different methods and applies the correct transactions.

    You can either add to these domains in ejb3-interceptors-aop.xml in which case it will apply to all beans matching your pointcuts, or you can create a custom domain with more bindings and choose to apply it to a particular bean using the @AspectDomain annotation

    http://www.jboss.org/ejb3/docs/tutorial/configuration/configuration.html
    explains more about this. You can get there by going to http://www.jboss.org/community/wiki/EJB3 and then 'Tutorial' and then 'Custom configuration'


  • 13. Re: Deploy AOP to jboss 5.1
    Przemysław Chmielewski Newbie

    Karen,

     

    Does it works for you? I'm trying to add some custom additional annotation on my stateless ejb which is also my webservice but it dosen't call my aspect. I'm using jboss 6 application server. Have you used your configuration on jboss 6?

  • 14. Re: Deploy AOP to jboss 5.1
    Przemysław Chmielewski Newbie

    I forgot mention that when I have bind pointcut configure lie execution(* MyBean->someMethod(..)) aspect is running. But when I have

    execution(* *->@MyAnnotation()) it's not working.

1 2 Previous Next