Par*_*bay 16 java spring amqp rabbitmq spring-amqp
我的容器XML配置:
<rabbit:listener-container
connection-factory="myConnectionFactory"
acknowledge="none"
concurrency="10"
requeue-rejected="false">
<rabbit:listener ref="myListener" queues="myQueue"/>
</rabbit:listener-container>
Run Code Online (Sandbox Code Playgroud)
而且myListener只是一堂课
@Component("myListener")
public class MyListener implements MessageListener {
@Autowired
SomeDependency dependency;
....
}
Run Code Online (Sandbox Code Playgroud)
我concurrency="10"在我的XML中指定了.这是什么意思完全相同?
我找到了一些文档.他们没有那么有用的陈述:
指定要创建的并发使用者数.默认值为1.
我感兴趣的是是否MyListener必须是线程安全的,即
SomeDependency dependency 一次或为每个线程/实例实例化?dependency需要线程安全吗?Gar*_*ell 15
是的,要使用并发性,您的侦听器必须是线程安全的.每个容器有一个侦听器实例.但是,<rabbit:listener-container/>namespace元素实际上只是添加"共享"属性的便利,每个侦听器元素都有自己的容器.
通常最好使用无状态对象(没有写入的字段),但这并不总是可行的.
如果您的监听器不是线程安全的,您可以使用...
<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>
Run Code Online (Sandbox Code Playgroud)
...并添加@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE).然后,您将为每个侦听器获取一个容器,并将为每个侦听器注入另一个侦听器实例.
对于注入侦听器的任何非线程安全依赖项,您还需要原型范围.
| 归档时间: |
|
| 查看次数: |
10320 次 |
| 最近记录: |