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 を送信し、後で興味のないものをキューに戻すことはできますが、単一のメッセージを見つけるためのこの方法はすでに非効率的ですが、その方法ではさらに非効率的になります。