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