Мне нужно найти конкретное сообщение в очереди ActiveMQ с помощью PHP и удалить его.
AFAIK единственный способ сделать это – прочитать все сообщения, которые в настоящее время поставлены в очередь, и ACK – одно из сообщений, которое меня интересует. ( Пример в руководстве PHP для Stomp :: 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; } } }
Согласно моей логике, это должно сработать. При запуске кода считывается только одно случайное сообщение, несмотря на проверку большего количества кадров.
Следующий кадр кажется только подготовленным, когда рамка, которую мы сейчас читаем, была ACK'ed. (Когда я вручную ACK всех сообщений цикл while работает по назначению, все сообщения обрабатываются.
Кто-нибудь знает, как получить полный набор сообщений из очереди, без ACK'ing всех из них? Я могу ACK все из них и поставить те, которые меня не интересовали обратно в очередь, но этот уже неэффективный способ найти одно сообщение становится намного более неэффективным.