捕获org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage()调用

时间:2018-03-05 11:08:05

标签: spring-boot rabbitmq aop aspectj pointcut

我在Spring-boot项目中使用AspectJ和AOP,以便创建一个外部库来记录某些活动。

虽然我已经配置了这个切入点:

 @Before(value="getEventOnMessage()")
    public  void getEventOnMessage(JoinPoint joinPoint){
        System.out.println("VOILA'");
    }

方面

package com.tim.sdp.timLogging.Aspects.handler;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan(basePackages="org.springframework.amqp.rabbit.listener.adapter")
    public class AppConfig {
        @Bean()
        public AspectForOnMessage myAspect() {
            return new AspectForOnMessage();
        }
    }

未触发。

详细说明:

package com.tim.sdp.timLogging.Aspects.handler;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AspectForOnMessage {

    @Pointcut("call(void org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(Message,Channel))")
    private void getEventOnMessage(){}

    @Before(value="getEventOnMessage()")
    public  void getEventOnMessage(JoinPoint joinPoint){
        System.out.println("VOILA'");
    }
}

Aspect类实现:

mylogger.db:
    alias: monolog.logger.db
    public: true

你可以帮助我吗?这是我无法捕捉的唯一事件。 在这个论坛中,你可以找到另一个有同样问题的人:

Spring forum link

提前谢谢。

1 个答案:

答案 0 :(得分:1)

哦,一个古典的!

正如文档here所示,您在应用程序中通过call()配置的基于代理的Spring AOP不支持@EnableAspectJAutoProxy。您需要切换" AOP lite"如there所描述的那样完全支持AspectJ,或者坚持使用Spring AOP中真正支持的切入点。