繁体   English   中英

使用 JMS 主题和 ActiveMQ Artemis 保证交付

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM