java - ActiveMQ:队列(具有并发消费者)和主题的正确配置

标签 java spring jms activemq apache-camel

我们有一个 ActiveMQ/Camel 配置,之前一直使用专门的消息队列和并发消费者。

但是,我们现在引入消息主题,并发现 - 由于并发消费者 - 主题中收到的消息会被多次使用。

此场景的正确配置是什么?

即,我们希望队列上收到的消息有多个并发消费者,但只需要为某个主题上收到的消息定义一个消费者。

这是当前配置:

<amq:connectionFactory id="amqConnectionFactory"
    useAsyncSend="true" brokerURL="${${ptl.Servername}.jms.cluster.uri}"
    userName="${jms.username}" password="${jms.password}" sendTimeout="1000"
    optimizeAcknowledge="true" disableTimeStampsByDefault="true">
</amq:connectionFactory>

<bean id="cachingConnectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
    <property name="cacheConsumers" value="true"></property>
    <property name="cacheProducers" value="true"></property>
    <property name="reconnectOnException" value="true"></property>
    <property name="sessionCacheSize" value="${jms.sessioncachesize}"></property>
</bean>

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="cachingConnectionFactory" />
    <property name="transacted" value="false" />
    <property name="concurrentConsumers" value="${jms.concurrentConsumer}" />
    <property name="maxConcurrentConsumers" value="${jms.max.concurrentConsumer}" />
    <property name="preserveMessageQos" value="true" />
    <property name="timeToLive" value="${jms.timeToLive}" />
</bean>

<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig" />
</bean>

最佳答案

您可以将任何主题消费者的并发消费者/最大并发消费者显式设置为“1”。

from("activemq:topic:myTopic?concurrentConsumers=1&maxConcurrentConsumers=1")...  

或者,将 JmsConfiguration并发/maxConcurrentConsumers属性设置为“1”,然后根据需要显式启用队列的并发消费。

from("activemq:queue:myQueue?maxConcurrentConsumers=5")...  

此外,您还可以使用Virtual Topics执行主题消息的并发消费而不会重复(强烈推荐传统主题)

关于java - ActiveMQ:队列(具有并发消费者)和主题的正确配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9881629/

相关文章:

java - 显式定义构造函数时,类中没有定义参数为 0 的构造函数

java - 如何实现多线程以调用多个数据的 REST URL

jms - 选择性出队的消息是否保持 FIFO 顺序 (MQ)?

java - 如何创建只有两个订阅者的 JMS 目标?

java - Infinispan拦截器配置?

java - 何时使用 clone() 以及 addAll() 和 add() 的实际工作原理

java - 如何处理 Sonarlint java :S2259 (Null pointers should not be dereferenced)

java - hibernate中要遍历的节点不能为空异常

java - Apache Camel JMS : "Not allowed to create destination" when trying to connect to a queue

java - 如何使用 jdbc 模板将值列表作为参数传递给 IN 子句