2014-05-09 24 views
5

Sto lavorando a un'applicazione di chat sviluppata utilizzando Spring4 Messaging e STOMP implementata con SockJS. L'applicazione funziona benissimo quando uso il Broker Simple Message:Configurare il broker esterno (RabbitMQ) nell'applicazione Spring4 + STOMP + SockJS

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

Ma, ora abbiamo un obbligo di utilizzare un mediatore esterno (RabbitMQ) con la stessa applicazione. Per questo, ho cambiato il codice precedente con il seguente:

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

Il mio lato client si connette utilizzando il client STOMP, come di seguito:

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

Ma, ho ottenuto la seguente eccezione:

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] 

Ho controllato RabbitMQ ed è attivo e funzionante. Il plugin STOMP è anche installato e funzionare benissimo in RabbitMQ.I anche provato la seguente:

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

ho fatto un po 'di ricerca, ma ancora in grado di risolvere questo. Qualcuno può far luce su questo?

+0

Se è l'unica cosa che hai cambiato, ti mancano molte altre proprietà. Vedi anche http://stackoverflow.com/questions/20747283/spring-4-websocket-remote-broker-configuration e [javadoc] (http://docs.spring.io/spring/docs/current/javadoc-api /org/springframework/messaging/simp/config/StompBrokerRelayRegistration.html) –

+0

Ho provato tutte le proprietà (modificato la domanda). Penso che manchi qualcosa sul lato client, ma non so cosa. –

risposta

2

Dopo aver fatto alcune ricerche e alcuni esperimenti, come previsto, ho scoperto che il problema è dal lato del cliente. Cambiare

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

a

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

funzionato come un fascino. Qui, il primo argomento ospite è il nome utente e secondo argomento ospite è la password di del server RabbitMQ. Quindi il punto di base qui è che ogni volta che si configura un broker esterno è necessario passare il nome utente e la password del server. In caso di broker semplice, non è necessario passare le credenziali. Saluti!!

+1

Anche se un po 'vecchio, potrebbe valere la pena menzionare che è possibile evitare di passare il nome utente e la password con la connessione se si specificano le credenziali di accesso del client da Spring E si imposta l'utente predefinito per il plugin stomp RabbitMQ. [Vedi la sezione utente predefinita per maggiori dettagli] (http://www.rabbitmq.com/stomp.html) –