如何在 ActiveMQ Artemis 中创建非持久队列?

How to create a non durable queue in ActiveMQ Artemis?

我有一个应用程序,我希望在 Active MQ Artemis 中有 1 个持久队列和 1 个非持久队列。 为了连接到这个消息总线,我使用 amqpnetlite。

        var source = new Source()
        {
        };

        if (durable)
        {
            source.Address = amqpAddressConverter.GetSubscriberAddress(address, useLoadBalancing);
            source.Durable = 1;
            source.ExpiryPolicy = new Symbol("never");
            source.DistributionMode = new Symbol("copy");
        }
        else
        {
            source.Address = amqpAddressConverter.GetSubscriberAddress(address);
            source.Durable = 0;
            source.ExpiryPolicy = "never";
        }

        var receiverLink = new ReceiverLink(session, linkName, source, null);

所以这是我的接收器 link。如图所示,我设置了将提供给 ReceiverLink 的 Source 的 Durable uint。

因为正如我在 Active MQ Artemis 文档中看到的那样,Durable 是一个布尔值,但在 amqpnetlite 库中它是一个单位,我的理解是超过 0 的所有内容都应该为真,而 0 应该为假。

起初行为很奇怪:即使 Aretemis Web 界面显示队列是持久的,只要没有消费者连接,它就会被删除。

我发现了这个: 它描述了由于默认行为甚至持久队列也会被删除。

所以我操纵了 broker.xml 并将 AUTO-DELETE-QUEUE 设置为 false。

从那时起,行为就完全转变了: 两个(持久 = 1 和持久 = 0)队列在连接断开后仍然存在。

那么如何正确创建持久连接和非持久连接呢?

Artemis 源代码在 .NET 中带有一个 example,它创建了一个持久的主题订阅,还展示了稍后如何使用 AmqpNetLite 恢复它。

许多人忽略的一个关键问题是您的客户端需要使用类似于 JMS 客户端 ID 概念的唯一容器 ID。

对于特定于队列的订阅,客户端应在 link 功能中指明它希望创建一个基于队列的地址,因为默认情况下是一个行为不同的多播队列。

Source source = new Source() {
    Address = address,
    Capabilities = new Symbol[] {"queue"},
};

与主题特定的源配置:

Source source = new Source() {
    Address = address,
    Capabilities = new Symbol[] {"topic"},
};