当前位置: 首页 > 知识库问答 >
问题:

Artemis STOMP消息未传递到OPENWIRE JMS客户端

仲孙信瑞
2023-03-14

我们正试图从ActiveMQ5.x升级到最新的Artemis(2.17),但我们的一个应用程序让我们很难过。

我们单独运行了一个事务,启用了Artemis STOMP调试,下面是我们看到的:

07:47:42,180 STOMP(/10.0.0.5:40618, f985f04d): IN << StompFrame[command=CONNECT, headers={login=<appid>, passcode=<app-password>}]
07:47:42,196 STOMP(/10.0.0.5:40618, f985f04d):OUT >> StompFrame[command=CONNECTED, headers={session=f985f04d}]
07:47:42,203 STOMP(/10.0.0.5:40618, f985f04d): IN << StompFrame[command=SUBSCRIBE, headers={ack=client, destination=/temp-queue/Reply-604379ee2f900, activemq.prefetchSize=1}]
07:47:42,235 STOMP(/10.0.0.5:40618, f985f04d): IN << StompFrame[command=SEND, headers={expires=1615035162000, destination=/queue/target, content-type=text/plain, reply-to=/temp-queue/Reply-604379ee2f900}, body=<--- message text---> body-bytes=[<--- message bytes --->, size=0]
07:48:42,247 STOMP(/10.0.0.5:40618, f985f04d): IN << StompFrame[command=DISCONNECT, headers={}]

问题的核心似乎是来自上面显示的“send”操作的消息从未到达接收者。我们已经验证了接收者是在线的,并且它响应使用JMS和Openwire连接的其他客户端--但是这个STOMP消息没有被路由到目的地。

如果关闭Artemis并恢复到ActiveMQ5.x,则应用程序可以正常工作。

我们使用默认配置:

<acceptors>

         <!-- useEpoll means: it will use Netty epoll if you are on a system (Linux) that supports it -->
         <!-- amqpCredits: The number of credits sent to AMQP producers -->
         <!-- amqpLowCredits: The server will send the # credits specified at amqpCredits at this low mark -->
         <!-- amqpDuplicateDetection: If you are not using duplicate detection, set this to false
                                      as duplicate detection requires applicationProperties to be parsed on the server. -->
         <!-- amqpMinLargeMessageSize: Determines how many bytes are considered large, so we start using files to hold their data.
                                       default: 102400, -1 would mean to disable large mesasge control -->

         <!-- Note: If an acceptor needs to be compatible with HornetQ and/or Artemis 1.x clients add
                    "anycastPrefix=jms.queue.;multicastPrefix=jms.topic." to the acceptor url.
                    See https://issues.apache.org/jira/browse/ARTEMIS-1644 for more information. -->


         <!-- Acceptor for every supported protocol -->
         <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>

         <!-- AMQP Acceptor.  Listens on default AMQP port for AMQP traffic.-->
         <acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpMinLargeMessageSize=102400;amqpDuplicateDetection=true</acceptor>

         <!-- STOMP Acceptor. -->
         <acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true</acceptor>

         <!-- HornetQ Compatibility Acceptor.  Enables HornetQ Core and STOMP for legacy HornetQ clients. -->
         <acceptor name="hornetq">tcp://0.0.0.0:5445?anycastPrefix=jms.queue.;multicastPrefix=jms.topic.;protocols=HORNETQ,STOMP;useEpoll=true</acceptor>

         <!-- MQTT Acceptor -->
         <acceptor name="mqtt">tcp://0.0.0.0:1883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true</acceptor>

      </acceptors>

我们是否需要一些神奇的配置来将这些STOMP消息路由到正确的目的地?

共有1个答案

贝德辉
2023-03-14

第一个问题是消息发送到的目标。如ActiveMQ5.x STOMP文档中所述,send帧的destination标头上使用的/queue/前缀将自动删除。但是,在ActiveMQ Artemis中,这需要通过ActiveMQ Artemis STOMP文档中讨论的anycastprefix参数显式配置,例如:

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

这里还配置了multicastprefix以确保完整性。

一旦配置完成,您的消息将按预期发送到target

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

由于您的Stomp客户机使用/temp-queue/指定reply-to标头,而OpenWire客户机也使用此标头,因此您还需要更改OpenWireacceptor,例如:

xml prettyprint-override"><acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;anycastPrefix=/temp-queue/;multicastPrefix=/temp-topic/</acceptor>

我打开了ARTEMIS-3164,以实现一个前缀,用于标识ActiveMQ Artemis中的临时资源。

 类似资料:
  • 目前,当我的STOMP使用者连接到队列时,被缓冲的消息最终不会被处理。我所说的“缓冲起来”是指生产者在没有消费者连接的情况下向队列写了消息。继续这个场景,当我的消费者连接时,他们能够看到消息,但只能看到新的消息。任何先前的消息最终都不会被发送给消费者。 代理配置

  • FCM服务未向我的iOS应用程序发送消息。 > App CAN成功接收APNs令牌和实例ID令牌 App CAN使用推送通知实用程序利用. p8令牌在后台成功接收来自APN的推送 #2中使用的相同APNs密钥上传到Firebase控制台 应用程序无法接收Firebase控制台中Notification Composer发送的消息,也无法使用CURL请求接收消息。 应用程序在通过FCM发送时不显示任

  • 由于内容脚本在网页而不是扩展程序的上下文中运行,因此它们通常需要某种与扩展程序其余部分进行通信的方式。例如,RSS 阅读器扩展程序可以使用内容脚本来检测页面上 RSS 摘要的存在,然后通知后台页面以显示该页面的操作图标。 扩展及其内容脚本之间的通信使用消息传递来实现。任何一方都可以监听从另一端发送的消息,并在同一通道上进行响应。消息可以包含任何有效的 JSON 对象(空,布尔值,数字,字符串,数组

  • ms tcp nodelay 描述: 在信差的 TCP 会话上禁用 nagle 算法。 类型: Boolean 是否必需: No 默认值: true ms initial backoff 描述: 出错时重连的初始等待时间。 类型: Double 是否必需: No 默认值: .2 ms max backoff 描述: 出错重连时等待的最大时间。 类型: Double 是否必需: No 默认值: 15

  • 消息传递 目录 一次简单的请求 h3Name 长时间保持连接 h3Name 扩展之间的消息传递 h3Name 安全策略 h3Name 范例 h3Name API reference Properties propertyName Methods methodName Events eventName Types id For information on how to use experiment

  • 我得到这个错误时,调用请求权限()方法的Firebase消息。 [错误:flatter/lib/ui/ui_dart_state.cc(209)]未处理的异常:MissingPluginException(未找到方法消息传递的实现#通道插件上的requestPermission.flatter.io/firebase_消息传递)E/flatter(7180):#0 convertPlatformE