gpt4 book ai didi

java - 在监听 RabbitMQ 消息的上下文中不会触发方面

转载 作者:行者123 更新时间:2023-12-01 22:17:39 25 4
gpt4 key购买 nike

下面的 FailedMessageAspect.afterMethod() 在下面的 RabbitConsumerMain.main() 期间成功调用。但是,当它在监听 RabbitMQ 消息的上下文中使用时(当 MessageHandlerImpl.handleMesasge() 从 RabbitMQ 队列接收消息时),它不会被调用。知道为什么吗?

FailedMessageAspect.java

@Aspect
@Component
public class FailedMessageAspect {

@AfterReturning("execution(* com..MessageHandlerImpl.testAspect(..))")
private void afterMethod() {
System.out.println("aspect foo");
}
}

MessageHandlerImpl.java

@Component
public class MessageHandlerImpl implements MessageHandler {

@Override
public void testAspect() {
System.out.println("handler foo");
}

@Override
public void handleMessage(String message) {
// handleMessage is called successfully when message is received
testAspect();
// FailedMessageAspect.afterMethod() does not get called
}
}

RabbitConsumerMain.java

@Controller
@SpringBootApplication
public class RabbitConsumerMain implements CommandLineRunner {

@Autowired
private MessageHandler messageHandler;

public static void main(String[] args) throws Exception {
SpringApplication.run(RabbitConsumerMain.class, args);
}

@Override
public void run(String... args) {
messageHandler.testAspect();
//FailedMessageSpect.afterMethod() gets called right here
}
}

ConsumerConfiguration.java

@Configuration
public class ConsumerConfiguration {
@Autowired @Lazy
private MessageHandler messageHandler;

//other standard AMQP configs

@Bean
public MessageListenerContainer messageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
container.setQueues(workQueue());
MessageListenerAdapter adapter = new MessageListenerAdapter(messageHandler, new Jackson2JsonMessageConverter());
container.setMessageListener(adapter);
return container;
}
}

最佳答案

您没有显示所有配置,但需要明确的是,Spring AOP 建议内部方法调用,例如 handleMessage 调用 testAspect() 在同一个类实例中。

为此,您需要使用 AspectJ;否则,您建议的所有方法都必须是通过 bean 定义调用的公共(public)方法,以便 Spring 可以通过代理调用该方法。永远不建议在 bean 内进行内部调用。

参见the reference manual以获得完整的解释。

关于java - 在监听 RabbitMQ 消息的上下文中不会触发方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com