是的,要使用并发,您的侦听器必须是线程安全的。每个容器有一个侦听器实例。但是,
<rabbit:listener-container/>名称空间元素实际上只是添加“共享”属性的便利,每个侦听器元素都有自己的容器。
通常最好使用无状态对象(不写入任何字段),但这并不总是可能的。
如果您的监听器不是线程安全的,则可以使用…
<rabbit:listener-container connection-factory="myConnectionFactory" acknowledge="none" requeue-rejected="false"> <rabbit:listener ref="myListener" queues="myQueue"/> <rabbit:listener ref="myListener" queues="myQueue"/> <rabbit:listener ref="myListener" queues="myQueue"/> <rabbit:listener ref="myListener" queues="myQueue"/> ...</rabbit:listener-container>
…并添加
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)。然后,您将为每个侦听器得到一个容器,并且侦听器的不同实例将被注入到每个侦听器中。
对于注入到侦听器中的任何非线程安全的依赖项,您还将需要原型作用域。



