如何使用非线程安全的 MessageListener 实现并发
How to Achieve Concurrency With a Non-Thread-Safe MessageListener
this question 的答案解释了当侦听器不是线程安全时如何在 Spring AMQP 中使用带有 <rabbit:listener-container/>
的原型作用域。
另一位用户询问(在评论中)如何仅使用 Java 配置来配置相同的环境。
通常最好的做法是为侦听器使用无状态 bean,但如果这不可能,则仅使用 Java 配置来配置 @Prototype
作用域侦听器(和多个容器),您可以使用:
@Bean
public SimpleMessageListenerContainer container1() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueueNames("test.mismatch");
container.setMessageListener(new MessageListenerAdapter(listener()));
container.setMismatchedQueuesFatal(true);
return container;
}
...
@Bean
public SimpleMessageListenerContainer containerN() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueueNames("test.mismatch");
container.setMessageListener(new MessageListenerAdapter(listener()));
container.setMismatchedQueuesFatal(true);
return container;
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyNotThreadSafeListener listener() {
return new MyNotThreadSafeListener();
}
请记住,注入到 MyNotThreadSafeListener
中的任何依赖项也必须是原型 bean。
底线是无状态 bean 是最好的。
this question 的答案解释了当侦听器不是线程安全时如何在 Spring AMQP 中使用带有 <rabbit:listener-container/>
的原型作用域。
另一位用户询问(在评论中)如何仅使用 Java 配置来配置相同的环境。
通常最好的做法是为侦听器使用无状态 bean,但如果这不可能,则仅使用 Java 配置来配置 @Prototype
作用域侦听器(和多个容器),您可以使用:
@Bean
public SimpleMessageListenerContainer container1() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueueNames("test.mismatch");
container.setMessageListener(new MessageListenerAdapter(listener()));
container.setMismatchedQueuesFatal(true);
return container;
}
...
@Bean
public SimpleMessageListenerContainer containerN() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
container.setQueueNames("test.mismatch");
container.setMessageListener(new MessageListenerAdapter(listener()));
container.setMismatchedQueuesFatal(true);
return container;
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyNotThreadSafeListener listener() {
return new MyNotThreadSafeListener();
}
请记住,注入到 MyNotThreadSafeListener
中的任何依赖项也必须是原型 bean。
底线是无状态 bean 是最好的。