如何为Mule类创建AOP拦截器?

时间:2014-08-07 16:30:29

标签: spring mule aspectj spring-aop

这是我到目前为止所尝试的并且我的拦截器未被触发(我的日志中没有“TATATA”):

我的拦截器AopLoggingInterceptor.java:

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;
    }   
}

META-INF / aop.xml:

<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>

我的Mule / Spring配置文件:

<?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文件配置包含一个带有一个入站端点的流,两个出站端点,记录器和变换器(有效流程经过广泛测试)。

VM args:

-XX:PermSize=128M -XX:MaxPermSize=256M -javaagent:D:\path\to\mule\opt\aspectjweaver-1.6.11.jar

从Eclipse开始的mule文件中提取,显示编织已创建:

[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'

编辑2

这是我可以获得的最佳结果(通过使用<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,我会得到与之前相同的结果(只能看到主类加载器)。这是否意味着骡子没有希望?

2 个答案:

答案 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