问题标签 [durable-subscription]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
377 浏览

activemq-artemis - Artemis 持久订阅消息存储

我试图了解 ActiveMQ Artemis 中持久订阅的工作原理。目前我最大的问题是关于存储。

我想知道消息是否重复,这意味着对于每个消费者来说,消息都存储在磁盘上,或者消息是否存储在一个地方,而消费者只知道他们断开连接并需要恢复的消息。

从我的测试中,我可以看到:对于固定的消息大小和发布的消息数量,磁盘上占用的空间是相同的,无论我有 1,2 还是 3 个持久订阅。我负责断开它们以便存储消息,不用担心。这会让我认为队列只知道消费者回来时需要开始消费的消息的索引。

但相反,我使用 iostat cmd 检查了每秒写入字节数,我拥有的持久订阅队列越多,这个统计数据增长得越多。这意味着消息是重复的。

你们是否有更多信息,甚至是负责此的源代码。

0 投票
1 回答
137 浏览

activemq-artemis - 在 Apache Artemis 中使用旧消息为新主题订阅者提供服务

我正在配置一个 Apache Artemis 消息代理。代理将接受大文件,下游消费者访问主题以处理最新文件。现在我想知道如何使最新的文件可用于开发运行。因为消息每天只到达几次,所以测试运行需要访问最后几条发送的消息,不能等待下一条。

对于生产和登台系统,我发现持久订阅工作正常。我已经调整了一个 Apache Camel 配置来作为说明。下面是两个接收消息的消费者,每个消费者都使用持久订阅:

这可以。如果消费者离线,它将在重新在线时接收消息。现在,如果另一个消费者加入测试;

因为订阅之前不存在,所以消费者将不得不等待新消息。我正在寻找的是新的订阅者可以立即获得可用的消息。我为这个概念找到了不同的名称,例如prefetchPolicyconsumerWindowSize或“追溯消费者”。但我不清楚哪些术语适用于 Apache Artemis 以及如何设置它们,因为这些示例大多是指 Apache ActiveMQ。

如何配置 Artemis 以便加入新订阅的消费者获取过去的消息?

0 投票
1 回答
210 浏览

activemq - ActiveMQ 新主题,没有消费者,不丢弃消息

我正在构建一个软件解决方案,它为每个新类别的事物创建 JMS 主题。该主题是在第一轮数据集成时创建的,并且必须进行通信。该主题的持久订阅由消费者创建,但仅在创建类别和第一个数据之后的一段时间。属于该类别的所有数据都作为消息发送给消费者,以便它们也得到更新。

在创建类别和创建持久订阅之间,最好丢弃消息。消费者首先对现有数据进行初始同步,然后创建持久订阅并监听创建/更新消息。

一种选择是让消费者在注册第一个持久订阅时创建主题。同时,如果将数据添加到类别中,则不会由产品发送,因此也不会创建主题。

如果不存在消费者,另一种选择是丢弃消息。我不是在谈论活跃的消费者,我说的是根本没有消费者。知道这是否可以实施吗?由于该主题没有持久/非持久订阅,因此我期望消息会被自动丢弃,但我错了。

你会选择哪个选项?

如果您查看下图,您将看到一个从未有订阅者排队的主题,其中有 4498 条消息。我是否以错误的方式解释了这些信息?

在此处输入图像描述

0 投票
2 回答
58 浏览

jms - 对多个目的地/主题使用相同的 JMS ClientID

我正在开发一个订阅 JBoss 4 上的两个主题并处理传入消息的新应用程序。实际上,我正在使用两个DefaultMessageListenerContainer具有持久订阅的连接。

当我对持久订阅使用相同的 ClientID 时,容器失败并出现错误:

是否有任何可能性两个将相同的 clientId 用于两个不同的目的地。是否还有其他ListenerContainer可以使用一个容器实例处理多个目的地的方法?

我们尝试使用相同的 clientId 的原因是因为我们尝试用它的订阅替换旧的应用程序。这个旧应用程序连接到一个 JMS 事务中的主题,并且能够使用相同的客户端 ID。

0 投票
0 回答
128 浏览

mqtt - activemq artemis 自动删除持久队列

编辑1:因此,在使用这些确切设置多次重新启动代理并且没有更改任何内容之后,今天的代理开始按照他应该的方式自动删除队列。
我不知道为什么它现在开始工作,因为我没有更改任何关于 broker.xml 和我的 mqtt 客户端的内容。
我不确定我是否应该关闭它,因为这里有一个错误,但由于我的问题已解决,如果我应该将它作为已解决,请发送评论。

我正在尝试使用 ActiveMQ Artemis 代理。
在我的 mobileApplication 中,设备通过 mqtt 订阅代理上的主题。
由于订阅的连接设置为 cleanSession=false 和 qos=1,因此代理会自动创建持久订阅。到目前为止,这按预期工作。
现在,由于某些设备可能会失去连接或电池耗尽或只是中断,我想确保在一段时间不活动后,这些持久队列会被自动删除。

这个接缝可以通过设置在代理中进行配置:
auto-delete-queues = true
auto-delete-addresses = true
auto-delete-queues-message-count = -1
auto-delete-queues-delay = timeout time in ms until delete
应该删除一段时间内没有消费者的自动创建队列。

我在地址设置中添加了该配置以匹配所有地址。(最后 4 行)

这行不通。只要我愿意,我可以等待,并且不会删除任何队列或地址。我还尝试将 address-queue-scan-period 设置为 30,这应该是默认值,这也没有帮助。

我在做什么/理解错误?

我的整个break.xml文件:

这也不适用于我明确设置地址设置的地址“android”。

我已经看过
http://ostack.cn/?qa=101336/ Apache ActiveMQ Artemis 持久订阅 TTL
ActiveMQ Artemis 队列在消费客户端关闭后删除
为什么 ActiveMQ Artemis 会在所有侦听器都被销毁时自动删除地址?
这对我来说真的不起作用