本文介绍了在 Spring4+STOMP+SockJS 应用中配置外部代理(RabbitMQ)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个使用 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用户名,第二个参数 guestRabbitMQ密码/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 应用中配置外部代理(RabbitMQ)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 07:54