1

以下に定義されている関数があります。

public function subscribe($someQueue)
{
    $callback = function($msg){
        return $msg->body;
    };
    $this->channel->basic_consume( $someQueue, '', FALSE, TRUE, FALSE, FALSE, $callback);
    while(count($this->channel->callbacks)) {
         $this->channel->wait();
    }
}

私は次の機能を使用しています:

注: 次の行は別のクラス ファイルにあるため、上記の関数を含むクラスのオブジェクトを作成します。

$objRMQ = new RabbitMQ();
$msgBody = $objRMQ->subscribe("someQueue");
echo "message body returned from someMethod: ".$msgBody; 

基本的に、すべてのメッセージの本文を、キューに発行された呼び出し元関数に返したいと考えています。

現在の出力:

message body returned from subscribe: NULL

期待される出力:

holla, this is your message from queue
4

1 に答える 1

0

この質問は古いのですが、まだ答えが出ていないので、簡単に説明します。あなたはおそらくすでに答えを理解しているでしょうが、これは将来誰かが検索するのに役立つかもしれません.

ここで重要な概念は「非同期実行」です。

メソッドを使用してチャネルをサブスクライブする場合basic_consume、コールバックを 1 回だけすぐに実行するように要求するのではなく、メッセージが使用可能になったら実行し、別のメッセージが使用可能になるたびに実行するように要求します。

AMQPLib の場合、wait()メソッドを繰り返し呼び出して新しいメッセージを待ちます。すなわちここに:

while(count($this->channel->callbacks)) {
     $this->channel->wait();
}

これを注意深く考えると、コードには 2 つの誤りがあります。

  • ラインreturn $msg->bodyには戻る場所がありませ。メソッドの実装のどこかで呼び出しが発生し、wait()から出力が得られない$this->channel->wait()ため、その戻り値で何もする方法がありません。
  • 一方、他$objRMQ->subscribe("someQueue")のクラスから呼び出すと、何かが返されることを期待していますが、その関数にはreturnステートメントがありません。唯一のreturnステートメントは、に渡した無名関数内にありますbasic_consume

解決策は基本的に、メッセージのすべてecho $msg->bodyの処理、または実行したい実際の処理をコールバック内で行うことです。wait()メッセージが入ってくるときに本当にデータを収集したい場合は、コールバックの外部でアクセス可能な変数にデータを保存できますが、そのデータで何かを行うには、ある時点でループから抜け出す必要があることに注意してください。

于 2016-02-16T19:03:04.603 に答える