2014-05-09 12 views
5

Ich arbeite an einer Chat-Anwendung entwickelt mit Spring4 Messaging und STOMP mit SockJS implementiert. Die Anwendung funktioniert gut, wenn ich die Simple Message Broker verwenden:Externe Broker (RabbitMQ) konfigurieren In Spring4 + STOMP + SockJS Anwendung

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

Aber jetzt haben wir eine Anforderung haben einen externen Broker (RabbitMQ) mit der gleichen Anwendung zu verwenden. Dafür änderte ich den obigen Code mit den folgenden:

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

Meine Client-Seite verbindet STOMP-Client wie folgt:

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

Aber ich bekam die folgende Ausnahme:

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] 

Ich habe RabbitMQ überprüft und es läuft. Das STOMP Plugin ebenfalls installiert und funktioniert gut in RabbitMQ.I auch versucht, die folgenden:

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

ich ziemlich viel Suche gemacht haben, aber noch nicht in der Lage, dies zu lösen. Kann jemand etwas Licht darauf werfen?

+0

Wenn das die einzige Sache ist, die Sie änderten, fehlen Ihnen einige andere Eigenschaften. Siehe auch http://stackoverflow.com/questions/20747283/spring-4-websocket-remote-broker-configuration und das [javadoc] (http://docs.spring.io/spring/docs/current/javadoc-api /org/springframework/messaging/simp/config/StompBrokerRelayRegistration.html) –

+0

Ich habe alle Eigenschaften ausprobiert (die Frage bearbeitet). Ich denke, auf der Clientseite fehlt etwas, aber ich weiß nicht was. –

Antwort

2

Nach einigen Recherchen und einigen Experimenten, wie erwartet, fand ich heraus, dass das Problem auf der Client-Seite ist. Ändern

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

zu

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

arbeitete wie ein Charme. Hier erstes Argument Gast ist der Benutzername und zweites Argument Gast das Passwort ist der RabbitMQ Server. Der grundlegende Punkt hier ist, dass, wenn Sie einen externen Broker konfigurieren, müssen Sie den Benutzernamen und das Passwort des Servers übergeben. Im Fall von einfachen Broker, keine Notwendigkeit, Anmeldeinformationen zu übergeben. Prost!!

+1

Obwohl es etwas alt ist, könnte es sich lohnen zu erwähnen, dass Sie vermeiden können, den Benutzernamen und das Passwort mit der Verbindung einzugeben, wenn Sie die Client-Anmeldedaten von Spring angeben und den Standardbenutzer für das RabbitMQ-Stomp-Plugin festlegen. [Weitere Informationen finden Sie im Standardbenutzerabschnitt] (http://www.rabbitmq.com/stomp.html) –