[英]Guaranteed Delivery with JMS topics and ActiveMQ Artemis
我正在探索整个 JMS 世界,现在每次我尝试使用一个主题(pub/sub)时,我最终都切换到一个队列,要么使用收件人列表模式,要么直接在消费者中执行各种计算(哪种事务方式并不理想,但我不确定定义大量队列是否是一种更好的做法)。
我需要确保所有订阅者都会收到所有消息,并且当我配置它时,它似乎与主题不兼容。
我正在使用嵌入式 ActiveMQ Artemis 配置(因此没有控制台,这无助于调试)和 Spring JMS。 我的broker.xml
如下所示:
<configuration
xmlns="urn:activemq"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
<jms xmlns="urn:activemq:jms">
</jms>
<core xmlns="urn:activemq:core">
<persistence-enabled>true</persistence-enabled>
<security-enabled>false</security-enabled>
<acceptors>
<acceptor name="in-vm">vm://0</acceptor>
</acceptors>
<address-settings>
<address-setting match="#">
<!-- all queues have redelivery -->
<redelivery-delay>200</redelivery-delay>
<max-redelivery-delay>60000</max-redelivery-delay>
<redelivery-delay-multiplier>1.5</redelivery-delay-multiplier>
<redelivery-collision-avoidance-factor>0.15</redelivery-collision-avoidance-factor>
<!-- all queues have dead-letters -->
<max-delivery-attempts>10</max-delivery-attempts>
<auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
</address-setting>
</address-settings>
</core>
</configuration>
我的jmsListenerContainerFactory
定义如下:
DefaultJmsListenerContainerFactory listenerContainerFactory = new DefaultJmsListenerContainerFactory();
listenerContainerFactory.setConnectionFactory(aConnectionFactory);
listenerContainerFactory.setDestinationResolver(aDestinationResolver);
listenerContainerFactory.setSessionTransacted(true);
listenerContainerFactory.setSessionAcknowledgeMode(JMSContext.SESSION_TRANSACTED);
listenerContainerFactory.setMessageConverter(aMessageConverter);
listenerContainerFactory.setTransactionManager(aTransactionManager);
return listenerContainerFactory;
我的消费者是各种类中的@Jmslistener
注释方法(如果重要的话,有时对于同一个 class 中的一个主题有多个)。
在我看来,消息似乎并不总是发送给所有消费者。 或者好像消费者在处理消息时会断开与主题的连接。
行为是一致的,并且在测试中 100% 发生。
我是否错过了一些重要的事情,或者主题不是为了可靠的沟通?
您所看到的是预期的行为。 一般来说,订阅者必须连接到代理才能接收消息。 这是传统的发布/订阅语义。
您可以通过使用持久订阅来更改此行为(在您的DefaultJmsListenerContainerFactory
实例上使用setSubscriptionDurable(true)
)。 但是,如果订阅者长时间断开连接,这可能会出现问题,因为消息会在他们的订阅中累积。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.