Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring4+中配置外部代理(RabbitMQ);跺脚+;SockJS应用程序_Rabbitmq_Stomp_Sockjs_Spring 4 - Fatal编程技术网

在Spring4+中配置外部代理(RabbitMQ);跺脚+;SockJS应用程序

在Spring4+中配置外部代理(RabbitMQ);跺脚+;SockJS应用程序,rabbitmq,stomp,sockjs,spring-4,Rabbitmq,Stomp,Sockjs,Spring 4,我正在开发一个聊天应用程序,它使用Spring4消息传递和STOMP开发,并使用SockJS实现。当我使用简单消息代理时,应用程序运行良好: config.enableSimpleBroker("/queue/", "/topic/"); 但是,现在我们需要对同一应用程序使用外部代理(RabbitMQ)。为此,我用以下代码更改了上述代码: // config.enableSimpleBroker("/queue/", "/topic/"); config.enableStompBrokerRe

我正在开发一个聊天应用程序,它使用Spring4消息传递和STOMP开发,并使用SockJS实现。当我使用简单消息代理时,应用程序运行良好:

config.enableSimpleBroker("/queue/", "/topic/");
但是,现在我们需要对同一应用程序使用外部代理(RabbitMQ)。为此,我用以下代码更改了上述代码:

// config.enableSimpleBroker("/queue/", "/topic/");
config.enableStompBrokerRelay("/queue", "/topic");
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");
我的客户端正在使用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中安装并运行良好。我还尝试了以下方法:

// config.enableSimpleBroker("/queue/", "/topic/");
config.enableStompBrokerRelay("/queue", "/topic");
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");

我已经做了相当多的搜索,但仍然无法解决这个问题。有人能解释一下吗?

在做了一些研究和实验后,正如预期的那样,我发现问题出在客户端。改变

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


工作得很有魅力。这里,第一个参数guest是用户名,第二个参数guest是RabbitMQ服务器的密码。因此,这里的基本要点是,无论何时配置外部代理,都需要传递服务器的用户名和密码。如果是简单代理,则无需传递凭据。干杯

如果这是您更改的唯一内容,那么您将丢失其他几个属性。另请参见和“我已尝试了所有属性”(编辑了问题)。我认为客户端缺少了一些东西,但不知道是什么。虽然有点旧,但值得一提的是,如果您从Spring指定客户端登录凭据并为RabbitMQ stomp插件设置默认用户,则可以避免在connect中传递用户名和密码。