在 Spring4+STOMP+SockJS 应用中配置外部 Broker(RabbitMQ) [英] Configure External Broker(RabbitMQ) In Spring4+STOMP+SockJS Application
问题描述
我正在开发一个使用 Spring4 Messaging 和 SockJS 实现的 STOMP 开发的聊天应用程序.当我使用 Simple Message Broker 时,应用程序运行良好:
I am working on a chat application developed using Spring4 Messaging and STOMP implemented with SockJS. The application works fine when I use the Simple Message Broker :
config.enableSimpleBroker("/queue/", "/topic/");
但是,现在我们需要在相同的应用程序中使用外部代理(RabbitMQ).为此,我使用以下内容更改了上述代码:
But, now we have a requirement to use an external broker(RabbitMQ) with the same application. For that, I changed the above code with the following:
// config.enableSimpleBroker("/queue/", "/topic/");
config.enableStompBrokerRelay("/queue", "/topic");
我的客户端正在使用 STOMP 客户端进行连接,如下所示:
My client side is connecting using STOMP client as below:
stompClient.connect({}, function(frame) {
// subscribe to topics or queues and other stuff
});
但是,我得到了以下异常:
But, I got the following exception:
2014-05-09 11:13:13,567 ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
org.springframework.messaging.MessageDeliveryException: Message broker is not active.
at org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler.handleMessageInternal(StompBrokerRelayMessageHandler.java:378) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler.handleMessage(AbstractBrokerMessageHandler.java:171) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.support.ExecutorSubscribableChannel.sendInternal(ExecutorSubscribableChannel.java:64) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:116) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:98) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.simp.SimpMessagingTemplate.doSend(SimpMessagingTemplate.java:129) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.simp.SimpMessagingTemplate.doSend(SimpMessagingTemplate.java:48) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:93) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:146) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:112) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:106) ~[spring-messaging-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at com.attomic.chat.service.ActiveUserPinger.pingUsers(ActiveUserPinger.java:24) ~[ActiveUserPinger.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_05]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_05]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_05]
at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0_05]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_05]
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) [na:1.7.0_05]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) [na:1.7.0_05]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_05]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.7.0_05]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_05]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_05]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_05]
我检查了 RabbitMQ,它已启动并正在运行.STOMP 插件也已安装并在 RabbitMQ 中运行良好.我还尝试了以下操作:
I checked RabbitMQ and it is up and running. The STOMP plugin is also installed and working fine in RabbitMQ.I also tried the following:
1. config.enableStompBrokerRelay("/queue", "/topic").setSystemLogin("guest").setSystemPasscode("guest");
2. config.enableStompBrokerRelay("/queue", "/topic").setClientLogin("guest").setClientPasscode("guest");
3. config.enableStompBrokerRelay("/queue", "/topic").setRelayHost("localhost").setRelayPort("15672");
我已经做了很多搜索,但仍然无法解决这个问题.有人可以对此有所了解吗?
I have done quite a bit of search but still unable to resolve this. Can somebody throw some light on this?
推荐答案
经过研究和实验,果然发现问题出在客户端.改变
After doing some research and some experiments, as expected, I found out that the problem is on the client side. Changing
stompClient.connect({}, function(frame) {
// subscribe to topics or queues and other stuff
});
到
stompClient.connect('guest', 'guest', function(frame) {
// subscribe to topics or queues and other stuff
});
像魅力一样工作.这里,第一个参数guest是用户名,第二个参数guest是RabbitMQ<的密码/strong> 服务器.所以这里的基本点是,每当您配置外部代理时,您都需要传递服务器的用户名和密码.在简单代理的情况下,不需要传递凭据.干杯!!
worked like a charm. Here, first argument guest is the username and second argument guest is the password of the RabbitMQ server. So the basic point here is that whenever you configure an external broker you need to pass the username and password of the server. In case of simple broker, no need of passing credentials. Cheers!!
这篇关于在 Spring4+STOMP+SockJS 应用中配置外部 Broker(RabbitMQ)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!