如何在 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"},
};
我有一个应用程序,我希望在 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"},
};