Spring AMQP Listener Container 中的并发是如何实现的? [英] How is concurrency in Spring AMQP Listener Container implemented?

查看:27
本文介绍了Spring AMQP Listener Container 中的并发是如何实现的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的容器 XML 配置:

My container XML config:

<rabbit:listener-container
        connection-factory="myConnectionFactory"
        acknowledge="none"
        concurrency="10"
        requeue-rejected="false">
    <rabbit:listener ref="myListener" queues="myQueue"/>
</rabbit:listener-container>

myListener 只是一个类

@Component("myListener")
public class MyListener implements MessageListener {
    @Autowired
    SomeDependency dependency;
    ....
}

我在 XML 中指定了 concurrency="10".这完全是什么意思?

I've specified concurrency="10" in my XML. What does this mean exactly?

我发现 一些文档.他们不是那么有帮助的说明:

I've found some docs. They are not that helpful stating:

指定要创建的并发消费者数量.默认为 1.

Specify the number of concurrent consumers to create. Default is 1.

<小时>

我感兴趣的是 MyListener 是否必须是线程安全的,即


What I am interested in is whether MyListener has to be thread safe i.e.

  • 是否创建了多个实例或多个线程使用单个实例?
  • 我可以在不同步的情况下访问实例字段吗?
  • SomeDependency dependency 是实例化一次还是为每个线程/实例实例化?
  • dependency 是否需要线程安全?
  • are there many instances created or single instance used by many threads?
  • can I access instance fields w/o synchronization?
  • is SomeDependency dependency instantiated once or for each thread/instance?
  • does dependency need to be thread safe?

推荐答案

是的,要使用并发,您的侦听器必须是线程安全的.每个容器有一个侦听器实例.但是,<rabbit:listener-container/> 命名空间元素实际上只是为了方便添加共享"属性,每个侦听器元素都有自己的容器.

Yes, to use concurrency, your listener has to be thread-safe. There is one listener instance per container. However, the <rabbit:listener-container/> namespace element is actually just a convenience for adding "shared" attributes, each listener element gets its own container.

通常最好使用无状态对象(没有写入的字段),但这并不总是可行的.

It's generally best to use stateless objects (no fields that are written to), but that's not always possible.

如果你的监听器不是线程安全的,你可以使用...

If your listener is not thread-safe, you can use...

<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).然后,您将为每个侦听器获得一个容器,并且每个侦听器的不同实例将被注入.

...and add @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE). You will then get a container for each listener and a different instance of the listener will be injected into each.

对于注入侦听器的任何非线程安全依赖项,您还需要原型作用域.

You will also need prototype scope for any non-thread-safe dependencies injected into the listener.

这篇关于Spring AMQP Listener Container 中的并发是如何实现的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆