2

PHP Stomp クライアントを使用して、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 を返します。

ドキュメントはあまり役に立ちませんでした。また、戻ってきてもStomp::error()あまり役に立ちません。stomp_connect_error()false

一時的な解決策として、毎回の前に再接続していsend()ます。

接続エラーをキャッチするより良い方法はありますか?

4

1 に答える 1

2

ストンププロトコル自体の仕様で答えを見つけました:

CONNECT 以外のクライアント フレームは、任意の値を持つ受信ヘッダーを指定できます。これにより、サーバーは、RECEIPT フレームの receive-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

この場合の最善の解決策とは思えませんが、私にとってはうまくいきます。

誰かがより良い方法を知っているなら、私はそれを聞いてうれしいです.


アップデート:

最終的に、Pecl stomp クライアントの代わりにStomp-PHP (純粋な PHP クライアント) に切り替えました。

于 2012-05-15T15:47:32.133 に答える