2

我正在尝试将 ActiveMQ-CPP 与 HornetQ 一起使用。我正在使用 ActiveMQ-CPP 捆绑示例,但我很难使用它。生产者的工作就像一个魅力,但消费者给了我以下信息:

* BEGIN SERVER-SIDE STACK TRACE
Message: Queue /queue/exampleQueue does not exist Exception Class
END SERVER-SIDE STACK TRACE *

FILE: activemq/core/ActiveMQConnection.cpp, LINE: 768
FILE: activemq/core/ActiveMQConnection.cpp, LINE: 774
FILE: activemq/core/ActiveMQSession.cpp, LINE: 350
FILE: activemq/core/ActiveMQSession.cpp, LINE: 281
Time to completion = 0.161 seconds.

问题是队列存在。该代码在 ActiveMQ+Openwire 上运行良好,但我对 HornetQ+STOMP 的运气并不好。

有任何想法吗?

4

2 回答 2

2

尝试将您在 Hornetq 上定义的相同队列地址设置为目的地。

可能您的队列是像这样在 HornetQ 上定义的

 <queue name="exampleQueue">
     <address>jms.queue.exampleQueue</address>
 </queue>

因此,尝试通过 STOMP 连接到该地址。

根据协议查看以下帧:

订阅队列

SUBSCRIBE
destination:jms.queue.exampleQueue

^@

发送消息

SEND
destination:jms.queue.exampleQueue

it works
^@

消息发送后,您将在订阅队列的会话中收到消息

MESSAGE
timestamp:1311355464983
redelivered:false
expires:0
subscription:subscription/jms.queue.exampleQueue
priority:0
message-id:523
destination:jms.queue.exampleQueue

it works

- 编辑

还有一点我想补充...

HornetQ 不符合 STOMP 的命名标准(参见http://community.jboss.org/message/594176),因此 activemq-cpp 有可能遵循 ativemq-nms 的行为,后者将队列的名称“标准化”为STOMP 标准:“/queue/YourQueue”(并导致命名问题)。

因此,如果是这种情况,即使您尝试将目标名称更改为“jms.queue.exampleQueue”,activemq-cpp 也可以将其规范化为“/queue/jms.queue.exampleQueue”。

在 NMS+HornetQ 中,没有“开箱即用”的方式来避免这种情况。唯一的选择是编辑 NMS 的源代码并删除规范化队列名称的部分。也许在activemq-cpp上也是一样的。

于 2011-07-26T12:57:04.380 回答
1

HornetQ 不喜欢 SUBSCRIBE 的“/queue/”前缀。我从 StompHelper 中的 ToStomp 方法中取出了它,一切正常。

于 2010-12-14T19:33:35.220 回答