这里的目标是:使用Stomp连接到ActiveMQ故障转移群集(主/从)的PHP应用程序。使用PHP/Stomp客户端进行故障转移的ActiveMQ
这里是版本:
- 的ActiveMQ 5.7
- PHP 1.0.5跺脚稳定
- PHP 5.4.4-14 + deb7u14(CLI)
这里是设置:
- 2台带ActiveMQ的服务器;
- keepalived安装在两台服务器上,共享VIP
- 的PHP脚本以下
< ? php $queue = '/queue/test'; try { $stomp = new Stomp("tcp://VIP:61613"); } catch(StompException $e) { die('Connection failed: ' . $e->getMessage()); } $stomp->subscribe($queue); while ($stomp->hasFrame()) { $frame = $stomp->readFrame(); var_dump($frame); print_r($frame->headers["message-id"]."\n"); if ($stomp->ack($frame)) print_r("Frame ACK!\n"); else die("ACK Error"); } ?>
随着消息的结果数,我们得到这类错误在ActiveMQ的调试日志
2014-10-03 13:19:13,941 | DEBUG |传输连接到: tcp://127.0.0.1:37125失败:java.io.EOFException | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport:tcp:///127.0.0.1:37125 @ 61613 java.io.EOFException at java.io.DataInputStream.readByte(DataInputStream.java:267) at org.apache.activemq.transport.stomp.StompWireFormat .readHeaderLine(StompWireFormat.java:155) 位于org.apache.activemq.transport.stomp.StompWireFormat.parseAction(StompWireFormat.java) :170) 在org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:98) 在org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:229) 在有机.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:221) at org.apache.activemq.transpor t.tcp.TcpTransport.run(TcpTransport.java:204) 在java.lang.Thread.run(Thread.java:745)
这将导致STOMP连接断开,并导致我们的其他问题。
看起来ActiveMQ错误可能与keepalived设置有关,并且更好的配置是在客户端使用故障转移方案。
我们试图在践踏对象创建这些连接字符串:
> failover://tcp://IP1:61613,tcp://IP2:61613
> failover:tcp://IP1:61613,tcp://IP2:61613
> failover://(tcp://IP1:61613,tcp://IP2:61613)
> failover:(tcp://IP1:61613,tcp://IP2:61613)
但他们都导致Invalid broker URI
错误。
无法找到这样的事情在网络上多DOC /问题..
任何recommandation还是劝上实现故障切换客户端?
故障转移不是跺脚规范的一部分。这是一些ActiveMQ客户端库实现的ActiveMQ功能。您可能必须在通用脚本库中手动重新连接。 – 2014-10-04 06:20:39
我有同样的问题,而我最终通过添加一个while循环来连接到活动的mq代理。您始终可以连接到贵宾地址,并让贵宾服务器将请求重定向到活动代理。我不认为stomp-php扩展现在支持故障转移。 – 2015-03-03 10:22:36