Howdy.  I'm trying to use AspectJ with Sonic ESB to intercept calls to the 
service() method of any custom ESB service.  That means I don't know the type 
of the service class in advance; I only know that it implements interface 
XQServiceEx.  The implemented service() method is invoked by the Sonic 
container every time a JMS message arrives at the service endpoint.  However, 
the container has a somewhat complex internal structure, and I'm getting three 
invocations of my advice for each inbound message.  (I hope my terminology 
isn't too far off.)

My aspect looks like this:


package com.ncr.eai.esb.aop;

import com.sonicsw.xq.XQService;
import com.sonicsw.xq.XQServiceEx;
import com.sonicsw.xq.XQServiceContext;
import com.sonicsw.xq.XQServiceException;
import com.ncr.eai.esb.*;

aspect XQServiceAspect {
 final String id = "O : ";

 pointcut serviceCall(XQServiceEx svc, XQServiceContext ctx) :
     call(void XQService.service(XQServiceContext)) &&
     target(svc) &&
     target(com.sonicsw.xq.XQService) &&
//     within(com.ncr..*) &&
     args(ctx);

    before(com.sonicsw.xq.XQServiceEx svc, XQServiceContext ctx): 
serviceCall(svc, ctx) {
     System.out.println(id + "Entering XQServiceEx.service(): " + 
thisJoinPointStaticPart.getSignature() + " " + svc + " " + ctx + " " + this);
    }

    void around(com.sonicsw.xq.XQServiceEx svc, XQServiceContext ctx): 
serviceCall(svc, ctx) {
     System.out.println(id + "In the around() advice before call to 
XQServiceEx.service(): " + thisJoinPointStaticPart.getSignature() + " " + svc + 
" " + ctx + " " + this);
     proceed(svc, ctx);
     System.out.println(id + "In the around() advice after call to 
XQServiceEx.service(): " + thisJoinPointStaticPart.getSignature() + " " + svc + 
" " + ctx + " " + this);
     }


    after(com.sonicsw.xq.XQServiceEx svc, XQServiceContext ctx) returning: 
serviceCall(svc, ctx) {
     System.out.println(id + "Returned from XQServiceEx.service(): " + 
thisJoinPointStaticPart.getSignature() + " " + svc + " " + ctx + " " + this);
    }
}


The output looks like this:


O : Entering XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain@c64bc2<mailto:com.sonicsw.xqimpl.service.XQServiceChain@c64bc2>
 
com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765<mailto:com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : In the around() advice before call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain@c64bc2<mailto:com.sonicsw.xqimpl.service.XQServiceChain@c64bc2>
 
com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765<mailto:com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : Entering XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : In the around() advice before call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : Entering XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.ncr.eai.esb.ServiceFromAspect@1510b03<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : In the around() advice before call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.ncr.eai.esb.ServiceFromAspect@1510b03<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
  >>>> Inside of the actual service() method!
  >>>> About to exit the actual service() method!
O : In the around() advice after call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.ncr.eai.esb.ServiceFromAspect@1510b03<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : Returned from XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.ncr.eai.esb.ServiceFromAspect@1510b03<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : In the around() advice after call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : Returned from XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a>
 
com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQServiceContextWrapper@19c705e>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : In the around() advice after call to XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain@c64bc2<mailto:com.sonicsw.xqimpl.service.XQServiceChain@c64bc2>
 
com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765<mailto:com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>
O : Returned from XQServiceEx.service(): void 
com.sonicsw.xq.XQService.service(XQServiceContext) 
com.sonicsw.xqimpl.service.XQServiceChain@c64bc2<mailto:com.sonicsw.xqimpl.service.XQServiceChain@c64bc2>
 
com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765<mailto:com.sonicsw.xqimpl.service.XQServiceContextImpl@97e765>
 
com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f<mailto:com.ncr.eai.esb.aop.XQServiceAspect@d8ce8f>


I know the results of my experimentation are kind of hard to read here, but 
each call to service() results in a sequence of three calls from 
com.sonicsw.xqimpl.service.<mailto:com.sonicsw.xqimpl.service.XQServiceChain@c64bc2>XQServiceChain,
 
com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper<mailto:com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper@195638a>,
 and 
com.ncr.eai.esb.ServiceFromAspect<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>.
  I only want to see one call per message, meaning one call to service().  And 
I don't know in advance what the name of the third class will be.  This test is 
being run with 
com.ncr.eai.esb.ServiceFromAspect<mailto:com.ncr.eai.esb.ServiceFromAspect@1510b03>,
 but there may be dozens of other classes, and I don't want to have to 
hard-code them; they need to be discovered.  I tried to add the commented out 
within(com.ncr..*)phrase, but using that prevented the pointcut from working at 
all.  I also tried to exclude com.sonicsw packages with things like 
!within(com.sonicsw..*), but that also stopped all pointcuts from working.

As far as deployment goes, I've got this aspect jarred up, and I'm doing 
load-time weaving by adding javaagent to the container command-line.  The 
overall strategy is working, but I have spent longer than I want to admit 
trying to construct a pointcut that works as expected.

Any "advice" appreciated!

Thanks,
Lee Grey, SOA Architect
NCR

_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to