2014-10-03 185 views
1

这里的目标是:使用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还是劝上实现故障切换客户端?

+0

故障转移不是跺脚规范的一部分。这是一些ActiveMQ客户端库实现的ActiveMQ功能。您可能必须在通用脚本库中手动重新连接。 – 2014-10-04 06:20:39

+0

我有同样的问题,而我最终通过添加一个while循环来连接到活动的mq代理。您始终可以连接到贵宾地址,并让贵宾服务器将请求重定向到活动代理。我不认为stomp-php扩展现在支持故障转移。 – 2015-03-03 10:22:36

回答

1

PHP践踏默认不支持故障转移,你必须自己实现,以支持它,像显示在下面的例子:

$urls = array('ip1:61613','ip2:61613'); 
$conn = null; 
foreach ($urls as $url) { 
    $url = "tcp://".$url; 
    try { 
     $conn = new \Stomp($url,$user,$passwd); 
    } catch(\Exception $e) { 
    } 
    if ($this->conn) { 
     break; 
    } 
} 
相关问题