如何使用非线程安全的MessageListener实现并发

时间:2016-01-21 14:09:06

标签: rabbitmq spring-amqp spring-rabbit

his old answer here的答案解释了当侦听器不是线程安全的时,如何在Spring AMQP中使用带有<rabbit:listener-container/>的原型范围。

另一位用户(在评论中)询问如何仅使用Java配置来配置相同的环境。

1 个答案:

答案 0 :(得分:8)

对于侦听器使用无状态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。

底线是无状态豆是最好的。