Stomp与ActiveMQ连接失败



我有一个php STOMP连接和运行在不同服务器上的ActiveMQ代理之间的通信问题。布局如下;

服务器A有一个简单的php脚本,包含一行;

$stomp = new Stomp('tcp://<ServerB>:61550');

服务器B有一个AMQ代理,使用以下transportConnector设置运行;

<transportConnectors>
    <transportConnector name="tcp" uri="tcp://0.0.0.0:61500"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61550"/>
    <transportConnector name="ssl" uri="ssl://0.0.0.0:61700?needClientAuth=true"/>
</transportConnectors>

服务器B也有一个Java客户端作为多个队列的消费者。

问题是,当我们在ServerA上运行脚本时,它会失败,并出现以下错误;

致命错误:未捕获的异常'StompException'伴有消息'Server is not responding'

在servverb的ActiveMQ日志中我们得到;

2014-07-01 11:33:32,754 | WARN | TransportConnection to: tcp://ServerA:48692 failed: java.io.IOException: Unknown data type: 69 | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///ServerA:48692@61500

2014-07-01 11:33:32,755 | WARN |传输连接到:tcp://ServerA:48692失败:org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: tcp://ServerA:48692 | org.apache.activemq.broker.TransportConnection.Transport |异步异常处理程序

我已经推断出失败的原因是,由于某种原因,来自A的STOMP请求被端口61500上的TCP侦听器拾取,而不是端口61550上的STOMP侦听器,并且由于协议不匹配而失败。

我尝试将端口61500的tcp transportConnector更改为stomp连接器,这解决了问题。但是许多其他应用程序依赖于61500作为tcp,所以它不是一个解决方案。

我一直在和我们的系统管理员交谈,他们确定防火墙设置正确,即使他们完全禁用了ServerB上的防火墙,也发生了同样的问题,所以我不知道这是否是问题的一部分。我们有另一台服务器,它具有几乎相同的activemq配置设置(tcp在61500上,stomp在61550上),它工作得很好,不同之处在于它有一个用于activemq web工具的jetty配置。

我真的不知道该怎么做,也不知道这是怎么发生的。如果有人有任何建议或能以任何方式提供帮助,我将不胜感激。

可能相关,但我不知道这些是什么意思,这里是telnet输出;

ServerA→上61550

telnet serverB 61550
Trying <serverB address>...
Connected to serverB.
Escape character is '^]'.
ðActiveMQ       Þ
MaxFrameSizÿÿÿ  CacheSize
CacheEnabledSizePrefixDisabled  MaxInactivityDurationInitalDelay'TcpNoDelayEnabledMaxInactivityDurationu0TightEncodingEnabledStackTraceEnabled

ServerA→上61500

telnet serverB 61500
Trying <serverB address>...
Connected to serverB.
Escape character is '^]'.
ðActiveMQ       Þ
MaxFrameSizÿÿÿ  CacheSize
CacheEnabledSizePrefixDisabled MaxInactivityDurationInitalDelay'TcpNoDelayEnabledMaxInactivityDurationu0TightEncodingEnabledStackTraceEnabledConnection closed by foreign host.

ServerB localhost 61550

telnet localhost 61550
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> quit
Connection closed.

ServerB localhost 61500

telnet localhost 61500
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
ðActiveMQ       Þ
MaxFrameSizÿÿÿ  CacheSize
CacheEnabledSizePrefixDisabled MaxInactivityDurationInitalDelay'TcpNoDelayEnabledMaxInactivityDurationu0TightEncodingEnabledStackTraceEnabledPuTTYConnection closed by foreign host.

我在网上唯一能找到的提到这些字符是这篇文章ActiveMQ远程连接拒绝尽管在代理URL 0.0.0.0。

不幸的是,我们不运行Karaf,我不确定它如何适用于我们。我在61550找不到其他的东西。

netstat -tulpn | grep 61550
tcp6       0      0 :::61550                :::*                    LISTEN      12870/java

感谢所有读过这篇文章的人,我试图提供尽可能多的信息。

您似乎使用了错误的URI连接到STOMP连接器。

替换$stomp = new Stomp('tcp://<ServerB>:61550');

$stomp = new Stomp('stomp://<ServerB>:61550');

请注意协议是stomp,而不是tcp。

最新更新