Почему ActiveMQ доставляет дубликаты сообщений моему потребителю PHP через Stomp?

Я не уверен, связан ли этот вопрос с топать-PHP или же ActiveMQ Docker (работает со значениями по умолчанию).

У меня есть простой вспомогательный класс Queue, написанный на PHP, который обрабатывает как отправку сообщения в очередь (Queue::push), а также потребляет его (Queue::fetch). Смотрите код ниже.

Как вы видете, fetch() следует подписаться на очередь, прочитать одно сообщение и отписаться. Сообщение должно быть подтверждено автоматически (\Stomp\StatefulStomp::subscribe()3-ий. аргумент).

По какой-то причине около 5-7% сообщений получает клиент дважды или даже трижды. Почему сообщения доставляются несколько раз и как этого избежать?


Издатель (отправка 1000 сообщений):

$mq = new Queue('tcp://activemq:61613','test');
for ($msgCount = 0; $msgCount < 1000; $msgCount++) {
$mq->push('Message #' . $msgCount);
}

Потребитель (получающий ~ 1070 сообщений):

$mq = new Queue('tcp://activemq:61613','test');
$received = 0;
while (true) {
$message = $mq->fetch();
if (null === $message) { break; }
$received++;
}

Код класса очереди:

use Stomp\Client;
use Stomp\Network\Connection;
use Stomp\SimpleStomp;
use Stomp\StatefulStomp;
use Stomp\Transport\Message;

class Queue
{
/**
* @var \Stomp\StatefulStomp
*/
private $stomp;

private $queue;

public function __construct($uri, $queue) {
$connection = new Connection('tcp://activemq:61613');
$this->stomp = new StatefulStomp(new Client($connection));
$connection->setReadTimeout(1);
$this->queue = $queue;
}

public function push($body) {
$message = new Message($body, ['activemq.maximumRedeliveries' => 0]);
$this->stomp->send('/queue/' . $this->queue, $message);
}
public function fetch() {
$subscriptionId = $this->stomp->subscribe('/queue/' . $this->queue, null, 'auto', ['activemq.prefetchSize' => 1]);
$msg = $this->stomp->read();
$this->stomp->unsubscribe($subscriptionId);
return $msg;
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector