我正在尝试使用HornetQ的ActiveMQ-CPP。我正在使用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没有同样的运气。
有什么想法吗?
答案 0 :(得分: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上也是如此。
答案 1 :(得分:1)
HornetQ不喜欢SUBSCRIBE的“/ queue /”前缀。我从StompHelper的ToStomp方法中取出了它,一切正常。