1

PHP を使用して ActiveMQ キュー内の特定のメッセージを見つけて削除する必要があります。

私の知る限り、これを行う唯一の方法は、現在キューに入れられているすべてのメッセージを読み取り、関心のある 1 つのメッセージに ACK を返すことです。 t すべてのメッセージを読み取りますが、一致するものだけに ACK を送信します)。

だから、私はこのコードを書きました(これは明らかに関連部分にすぎません):

class StompController {

    private $con;

    public function __construct($stompSettings) {
        try {
            $this->con = new Stomp($stompSettings['scheme']."://".$stompSettings['host'].":".$stompSettings['port']);
            $this->con->connect();
            $this->con->setReadTimeout(5);
        } catch(StompException $e) {
            die('Connection failed:' .$e->getMessage());
        }
    }

    public function __destruct() {
        $this->con->disconnect();
    }

    public function ackMessageAsRead($recipient,$message) {
        if($this->con->isConnected()) {
            //Subscribe to the recipient user's message queue.
            $this->con->subscribe("/queue/".$recipient);
            //Read all messages currently in the queue (but only ACK the one we're interested in).
            while($this->con->hasFrameToRead()) {
                $msg = $this->con->readFrame();
                if($msg != null && $msg != false) {
                    //This is the message we are currently reading, ACK it to AMQ and be done with it.
                    if($msg->body == $message) {
                        $this->con->ack($msg);
                    }
                } 
            }
        } else {
            return false;
        }
    }
}

私の論理によれば、これはうまくいくはずです。コードを実行している間、より多くのフレームをチェックしているにもかかわらず、1 つのランダムメッセージしか読み取られません。

次のフレームは、現在読み取っているフレームが ACK された場合にのみ準備されるようです。(すべてのメッセージを手動で確認すると、whileループは意図したとおりに機能し、すべてのメッセージが処理されます。

すべてのメッセージに ACK を送信せずに、キューからメッセージの完全なセットを取得する方法を知っている人はいますか? それらすべてに ACK を送信し、後で興味のないものをキューに戻すことはできますが、単一のメッセージを見つけるためのこの方法はすでに非効率的ですが、その方法ではさらに非効率的になります。

4

1 に答える 1

2

これは1に設定されているために問題になると思いactivemq.prefetchSizeます。ActiveMQは、任意の時点でコンシューマーにディスパッチできるメッセージの数にプリフェッチサイズを使用します。プリフェッチサイズに達すると、コンシューマーが確認応答の送信を開始するまで、コンシューマーにメッセージがディスパッチされなくなります。プリフェッチサイズを大きくすると、問題が解決するはずです。

プリフェッチ制限の詳細については、http://activemq.apache.org/what-is-the-prefetch-limit-for.htmlをお読みください。

于 2012-09-13T06:15:58.063 に答える