这是我到目前为止所尝试的并且我的拦截器未被触发(我的日志中没有“TATATA”):
package fr.mycompany.bus.flow.reco.ani.custom.interceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AopLoggingInterceptor {
@Around("execution(* org.mule.api.transport.MessageReceiver.routeMessage(org.mule.api.MuleMessage))")
public Object addMonitor(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("TATATA Before");
Object object = pjp.proceed();
System.out.println("TATATA After");
return object;
}
}
<aspectj>
<aspects>
<aspect name="fr.mycompany.bus.flow.reco.ani.custom.interceptor.AopLoggingInterceptor" />
</aspects>
<weaver options="-verbose">
<!-- Weave types that are within the org.mule.* packages. -->
<include within="org.mule.*" />
</weaver>
</aspectj>
<?xml version="1.0" encoding="UTF-8"?>
<mule >
<spring:beans>
<context:component-scan base-package="fr.mycompany.bus" />
<context:annotation-config />
<aop:aspectj-autoproxy />
<!-- Aspect -->
<spring:bean name="aopLoggingInterceptor" class="fr.mycompany.bus.flow.reco.ani.custom.interceptor.AopLoggingInterceptor" />
</spring:beans>
</mule>
我的Mule文件配置包含一个带有一个入站端点的流,两个出站端点,记录器和变换器(有效流程经过广泛测试)。
-XX:PermSize=128M -XX:MaxPermSize=256M -javaagent:D:\path\to\mule\opt\aspectjweaver-1.6.11.jar
[MuleApplicationClassLoader@2934847] info AspectJ Weaver Version 1.6.11 built on Tuesday Mar 15, 2011 at 15:31:04 GMT
[MuleApplicationClassLoader@2934847] info register classloader org.mule.module.launcher.MuleApplicationClassLoader@2934847
[MuleApplicationClassLoader@2934847] info using configuration /D:/BusToolBox/workspaces/dev/.mule/apps/bus-esb-mrc-reco-ani/classes/META-INF/aop.xml
[MuleApplicationClassLoader@2934847] info register aspect fr.mycompany.bus.flow.reco.ani.custom.interceptor.AopLoggingInterceptor
它适用于我的项目中包含的类,但不适用于mule类:
[MuleApplicationClassLoader@6ad5934d] debug generating class 'fr.mycompany.bus.flow.reco.ani.custom.transformer.CustomerDetailToSiebelRecoAniOutputTransformer$AjcClosure1'
这是我可以获得的最佳结果(通过使用<context:load-time-weaver />
),加载过程试图查找由差异类加载器加载的更多类,但结果是:
ERROR 2014-08-08 16:00:46,802 [main] org.mule.module.launcher.application.DefaultMuleApplication: null
java.lang.IllegalStateException: ClassLoader [org.mule.module.launcher.MuleApplicationClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar
如果我尝试使用spring-instrument-3.2.1.RELEASE.jar,我会得到与之前相同的结果(只能看到主类加载器)。这是否意味着骡子没有希望?
答案 0 :(得分:0)
使用Mule和Spring AOP查看this example。该示例显示了如何为组件调用Around建议,但拦截器应该类似。
答案 1 :(得分:0)
使用Spring AOP时有一些非常重要的事情。在this page中声明:
使用最简单的方法。 Spring AOP比使用简单 完整的AspectJ因为没有要求引入AspectJ 编译器/ weaver进入你的开发和构建过程。如果你 那么只需要建议对Spring bean的操作执行 Spring AOP是正确的选择。 如果您不需要建议对象 由Spring容器管理(通常是域对象), 然后你需要使用AspectJ 。您还需要使用AspectJ 如果您希望提供除简单方法执行以外的加入点 (例如,字段获取或设置连接点,等等。)
因此,如果您希望为MessageReceiver方法调用调用AopLoggingInterceptor,那将无法正常工作,因为MessageReceiver对象不是由Spring容器管理的。 Spring容器没有“看到”这个对象。
换句话说,Spring-AOP无法为Spring工厂创建的任何东西添加方面。我在这里发现spring aop documentation。