我正在使用PHP Stomp client发送stomp消息。
我想在后台打开持久连接,偶尔发送消息。
但是,如果在打开连接后发生连接错误(在send()上),我找不到处理连接错误的方法。
例如,在运行时:
<?php
$stomp = new Stomp('tcp://localhost:61613');
sleep(5); // Connection goes down in the meantime
$result = $stomp->send('/topic/test', 'TEST');
print "send " . ($result ? "successful\n": "failed\n");
?>
输出:send successful
即使在sleep()
期间连接断开,send()
也始终返回true。
docs不是很有帮助,Stomp::error()
和stomp_connect_error()
在返回false
时也无济于事。
作为临时解决方案,我在每send()
之前重新连接。
有没有更好的方法来捕获连接错误?
答案 0 :(得分:2)
在stomp协议本身的specification中找到答案:
除CONNECT之外的任何客户端框架都可以指定具有任意值的收据标头。这将使服务器确认收到带有RECEIPT帧的帧,该帧包含此标题的值作为RECEIPT帧中的receipt-id标题的值。
因此,设置“receipt”标头会使请求同步,因此与服务器的连接必须处于活动状态。
所以代码:
$result = $stomp->send('/topic/test', 'TEST');
print "send " . ($result ? "successful\n": "failed\n");
$result = $stomp->send('/topic/test', 'TEST', array('receipt' => 'message-123'));
print "send " . ($result ? "successful\n": "failed\n");
提供输出:
send successful
send failed
这似乎不是这种情况的最佳解决方案,但它适用于我。
如果有人知道更好的方式,我会很高兴听到它。
<强>更新强>
最终我切换到Stomp-PHP(一个纯PHP客户端)而不是Pecl stomp客户端,它处理它much better。