我遇到了php STOMP连接与在不同服务器上运行的ActiveMQ代理之间的通信问题。布局如下;
服务器A有一个包含该行的简单php脚本;
$stomp = new Stomp('tcp://<ServerB>:61550');
服务器B有一个运行以下transportConnector设置的AMQ代理;
<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'
在ServerB上的ActiveMQ日志中,我们得到了;
2014-07-01 11:33:32,754 |警告|传输连接到:tcp:// ServerA:48692失败:java.io.IOException:未知数据类型:69 | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport:tcp:/// ServerA:48692 @ 61500
2014-07-01 11:33:32,755 |警告|传输连接到:tcp:// ServerA:48692失败:org.apache.activemq.transport.InactivityIOException:无法发送,通道已失败:tcp:// ServerA:48692 | org.apache.activemq.broker.TransportConnection.Transport |异步异常处理程序
我已经推断出失败的原因是由于某种原因,来自A的STOMP请求被端口61500上的TCP侦听器而不是端口61550上的STOMP侦听器拾取,并且由于协议不匹配而失败
我尝试将端口61500的tcp transportConnector更改为stomp连接器,这解决了问题。但是其他一些应用依赖于61500是tcp,所以它不是解决方案。
我一直在和我们的系统管理员说话,他们确定防火墙设置正确,即使这样他们在ServerB上完全禁用防火墙也出现了同样的问题,所以我不知道这是否是问题的一部分。我们有另一台服务器具有几乎相同的activemq配置设置(tcp on 61500和stomp on 61550),它工作正常,不同的是它有一个用于ActiveMQ Web工具的jetty配置。
我不确定要尝试什么或者如何发生这种情况。如果有人有任何建议或以任何方式提供帮助,我们将不胜感激。
可能相关,但我不知道这些是什么意思,这里是telnet输出;
ServerA - &gt; ServerB 61550
telnet serverB 61550
Trying <serverB address>...
Connected to serverB.
Escape character is '^]'.
ðActiveMQ Þ
MaxFrameSizÿÿÿ CacheSize
CacheEnabledSizePrefixDisabled MaxInactivityDurationInitalDelay'TcpNoDelayEnabledMaxInactivityDurationu0TightEncodingEnabledStackTraceEnabled
ServerA - &gt; ServerB 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 remote connections refused despite 0.0.0.0 in broker URL。
我们很遗憾没有运行卡拉夫,我不确定它对我们有什么影响。我无法在61550上找到任何其他内容。
netstat -tulpn | grep 61550
tcp6 0 0 :::61550 :::* LISTEN 12870/java
感谢所有阅读过这一切的人,尽量提供尽可能多的信息。
答案 0 :(得分:-1)
您似乎使用错误的URI连接到STOMP连接器。
替换
$stomp = new Stomp('tcp://<ServerB>:61550');
带
$stomp = new Stomp('stomp://<ServerB>:61550');
观察协议是stomp,而不是tcp。