2014-05-09 65 views
5

我正在开发一个使用Spring4消息传递和使用SockJS实现的STOMP开发的聊天应用程序。在Spring4 + STOMP + SockJS应用程序中配置外部代理(RabbitMQ)

config.enableSimpleBroker("/queue/", "/topic/"); 

但是,现在我们必须使用相同的应用程序中使用外部代理(RabbitMQ的)要求:当我使用简单的Message Broker应用程序工作正常。对于这一点,我改变了上面的代码与以下:

// config.enableSimpleBroker("/queue/", "/topic/"); 
config.enableStompBrokerRelay("/queue", "/topic"); 

我的客户端使用如下STOMP客户端连接:

stompClient.connect({}, function(frame) { 
    // subscribe to topics or queues and other stuff 
}); 

但是,我得到了以下异常:

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做工精细也试过如下:

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"); 

我已经做了相当多的搜索,但仍然未能解决这个问题。有人可以对此有所了解吗?

+0

如果这是你改变的唯一的东西,你缺少其他几个属性。另见http://stackoverflow.com/questions/20747283/spring-4-websocket-remote-broker-configuration和[javadoc](http://docs.spring.io/spring/docs/current/javadoc-api /org/springframework/messaging/simp/config/StompBrokerRelayRegistration.html) –

+0

我试过所有的属性(编辑问题)。我认为客户端缺少一些东西,但不知道是什么。 –

回答

2

经过一番研究和一些实验,如预期的那样,我发现问题出在客户端。更改

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 
}); 

工作就像一个魅力。在这里,第一个参数客人用户名和第二个参数客人的RabbitMQ服务器的密码。因此,这里的基本要点是,无论何时配置外部代理,您都需要传递服务器的用户名和密码。在简单经纪人的情况下,不需要传递凭证。干杯!!

+1

虽然有点旧,但值得一提的是,如果您从Spring中指定了客户端登录凭据,并且为RabbitMQ stomp插件设置了默认用户,则可以避免在connect中传递用户名和密码。 [详细信息请参见默认用户部分](http://www.rabbitmq.com/stomp.html) –

相关问题