我试图发送一个消息,客户端输入到浏览器使用STOMP和ActiveMQ队列。从我在控制台上得到的读数来看,STOMP连接是成功的。我没有收到错误,正在使用以下行:
stompClient.send("/queue/testQSource", {}, JSON.stringify({ 'name': name }));
在我的index.html中这样做。但是,当我在浏览器中输入后检查ActiveMQ控制台时,没有添加到testQSource。我是否使用了正确的STOMP语法来实现这一点?除了STOMP源之外,我是否需要在HTML文件的顶部添加其他源?
队列在骆驼路由中实例化:
<from uri="jms:queue:testQSource"/>
<to uri="securityBean"/>
<log message="Routing message from testQSource to testQDestination queue with data ${body}"/>
<to uri="jms:queue:testQDestination"/>
<to uri="activationBean"/>
<log message="message: ${body}"/>
编辑
我现在收到一条消息,但收到以下警告:
WARN : org.apache.camel.component.jms.JmsBinding - Cannot determine specific JmsMessage type to use from body class. Will use generic JmsMessage. Body class: hello.HelloMessage. If you want to send a POJO then your class might need to implement java.io.Serializable, or you can force a specific type by setting the jmsMessageType option on the JMS endpoint.
我相信这是因为STOMP消息的形式与队列和/或路由所期望的不同。但是,我不确定如何以允许我使用STOMP消息的方式配置路由。任何建议吗?
在没有更多信息的情况下很难说,但我的第一个猜测是,在消息有机会写入套接字或被ActiveMQ读取之前,stomp客户端连接被关闭了。您可能需要考虑通过向出站帧添加请求id来阻塞队列,并等待Broker向您发送响应帧。这将确保您的消息在连接关闭之前被发布。
如何执行阻塞放置取决于您正在使用的客户端,因此您需要查看文档以查看正确的方法。通常有一个同步发送方法或客户端添加'收据'报头到帧,然后做一个阻塞接收,直到你得到一个收据帧与正确匹配的'收据-id'报头。
您是否在ActiveMQ服务器的stomp端口上连接?如"transportConnector"下的配置(activemq.xml)所示Stomp需要在默认配置的61613端口上连接。
使用Node.js与"stomp-client"和一个默认的ActiveMQ服务器在localhost:
var my_client = new Stomp('127.0.0.1', 61613, 'admin', 'admin');