当前位置: 首页 > 面试题库 >

Spring AMQP侦听器容器中的并发如何实现?

越俊艾
2023-03-14
问题内容

我的容器XML配置:

<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;
    ....
}

我已经concurrency="10"在XML中指定了。这是什么意思 完全相同

我找到了一些文档。他们没有那么有帮助的陈述:

指定要创建的并发使用者数。默认值为1。

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

  • 是否创建了许多实例或许多线程使用了单个实例?
  • 如何访问不同步的实例字段?
  • SomeDependency dependency 实例化一次或为每个线程/实例?
  • 确实dependency需要是线程安全的?

问题答案:

是的,要使用并发,您的侦听器必须是线程安全的。每个容器有一个侦听器实例。但是,<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)。然后,您将为每个侦听器得到一个容器,并且侦听器的不同实例将被注入到每个侦听器中。

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



 类似资料:
  • 我已经使用Spring Kafka创建了一个Kafka消费者,并将其部署在云铸造中。该主题有10个分区。我计划将应用程序扩展到10个实例,以便每个实例可以使用来自一个分区的消息。Spring Kafka支持并发消息侦听器容器,我猜它支持从每个分区创建多个线程来使用。例如,如果我有5个消费者实例,每个消费者实例可能有2个线程从分区消耗。因为我计划为每个分区创建一个应用实例,所以使用并发消费者有什么好

  • 大家好,我正在用ActiveMQ学习Spring JMS。在我的示例场景中,生产者应用程序在队列中发送大约50条消息,当我启动消费者应用程序时,它开始使用这些消息。 为每个侦听器启动的并发会话/使用者的数量。可以是表示最大值的简单数字(例如“5”),也可以是表示下限和上限的范围(例如“3-5”)。请注意,指定的最小值只是一个提示,可能会在运行时被忽略。默认值为1;如果有主题侦听器或队列排序很重要,

  • 要运行Kafka,需要在文件。有两种设置我不理解。 有人可以解释侦听器和广告侦听器属性之间的区别吗? 留档说: 侦听器:套接字服务器侦听的地址。 和 advertised.listeners:主机名和端口代理将向生产者和消费者做广告。 我什么时候必须使用哪个设置?

  • 问题内容: 我有一个要求,如果在db表中插入一条记录,则需要自动执行一个Java进程。实现db侦听器的最简单方法是什么? 问题答案: 我有一个针对Oracle的解决方案。自从甲骨文购买了Java以来​​,你不需要创建自己的应用程序,因此它发布了一个监听器。据我所知,这在内部不使用轮询,而是将通知推送到Java端(可能基于某些触发器): 你可以像这样实现它(这只是一个示例): 编辑: 你可以使用以下

  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real