gpt4 book ai didi

stomp - ApacheMQ Artemis 保留没有路由的消息

转载 作者:行者123 更新时间:2023-12-05 07:31:29 29 4
gpt4 key购买 nike

我使用的是 Artemis 2.6.2,只有 STOMP 和以下星座:

经纪人:

  • 没有在 broker.xml 中配置队列,一切都是自动创建的。

服务器:

  • 订阅目标 TaskResponse 没有选择器/过滤器
  • 发送到目标 TaskRequest, header clientId = ID(服务器请求的客户端的 ID)

客户端 123:

  • 使用选择器 clientId = 123 订阅目标 TaskRequest
  • 发送到目标 TaskResponse header clientId = 123

当我在 Artemis Console 上观看时,会发生以下情况:

  1. 没有服务器和客户端连接:没有地址或队列存在

  2. 服务器连接:Artemis 创建一个多播地址TaskResponse 和一个带有空过滤器的多播队列

  3. 客户端 123 连接:Artemis 创建一个多播地址 TaskRequest 并为此地址创建一个多播队列,过滤器 clientId = 123

  4. 消息交换:消息按预期从服务器传输到客户端,然后返回服务器。

  5. 客户端 123 断开连接:Artemis 删除多播地址 TaskRequest 以及过滤器 clientId = 123 的相应多播队列

  6. 服务器向客户端 123 的 TaskRequest 发送消息:根据服务器上的 STOMP 客户端,消息发送成功。在代理上,消息消失了。

  7. 相同的行为反之亦然:客户端 123 已连接但服务器未连接:根据客户端 123 上的 STOMP 客户端,消息已成功发送。在代理上,消息消失了。

我的猜测是消息被丢弃是因为没有到订阅者的路由。如果我在 broker.xml 的地址设置部分启用选项“send-to-dla-on-no-route”,消息将直接进入死信队列。

您知道在订阅者重新连接之前保留消息的方法吗?

附录 1:STOMP 消息

我正在使用 Stomp.Net LibrarySelectorsCore Example但只减少到选择器 s1。工作流程与我上面写的有点不同。

不幸的是,我没有找到一个示例来启用将 STOMP 消息记录到 Artemis 中的文件中。因此我用 WireShark 记录了数据包, 导出为文本并上传到 Gist StompMessages.txt .您可以在那里看到不同的 STOMP 消息,例如搜索 CONNECT、SEND 等。

解决方案

解决方案是在 broker.xmlacceptor 元素中使用选项 anycastPrefix=/queue/ 来强制队列输入任播:

<acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/</acceptor>

最佳答案

您观察到的是预期的行为。如果您将消息发送到没有队列的地址(或者在 STOMP 术语中 - 没有订阅者的目的地),那么该消息将无处可去并被丢弃。这是正常的发布/订阅语义。

如果您想在没有订阅者的情况下保留消息,您可以:

  1. 使用任播(即点对点)语义而不是多播。这在 Artemis documentation 中进行了讨论。 .
  2. 使用 Artemis documentation 中讨论的“持久”STOMP 订阅者.此处需要注意的是,在发送消息之前仍需要创建订阅,并且您还需要确保在完成订阅后删除订阅,否则它可能会累积消息。

关于stomp - ApacheMQ Artemis 保留没有路由的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770006/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com