PHP + Stomp + ActiveMq, AMQ_SCHEDULED_DELAY не работает

Я использую фреймворк laravel на основе php и Stomp + activeMQ. Здесь мне нужно что-то отправить в mq, однако сообщение должно быть использовано через 180 секунд, а не сразу.

Вариант 1, я отправляю его с меткой времени, и потребитель проверяет метку времени. Если интервал> 180, то сделайте что-нибудь и ack ().

Вариант 1 неэффективен, каждый момент потребитель проверяет временную метку, но подтверждено очень мало сообщений.

Вариант 2, shell_exec ("php send.php | сейчас + 3 минуты"), это выглядит странно.

Есть ли лучшие решения?

Я установил AMQ_SCHEDULED_DELAY в соответствии с советом Ли, однако сообщение будет отправлено немедленно. Возможно, конфигурация задержки может использоваться только для PUB / SUB, но не для PTP? Вот мой код:

        $con = new Stomp(config('app.mq_url'));
        if (!$con->isConnected()) {
            $con->connect();
            $con->setReadTimeout(3);
        }
        $con->begin("Transaction");
        $options =[
            'persistent'=> $persistent,
            'AMQ_SCHEDULED_DELAY' => $delay * 1000
        ];
        $con->send($queue, json_encode($params), $options);
        $con->commit("Transaction");
        $con->disconnect();
        $con->send($queue, json_encode($params), $options);

И я не забываю установить schedulerSupport = true в activemq.xml.

Я имею в виду следующее: ActiveMq Doc, это беспокоит? Я не знаю. Можно ли отправлять в заголовке "AMQ_SCHEDULED_DELAY"? Поскольку ActiveMq Doc: Stomp не отображает его как заголовок.

Проверьте свойства сообщения. Свойство сообщения scheduleJobId зарезервировано для использования планировщиком заданий. Если это свойство установлено перед отправкой, сообщение будет отправлено немедленно, а не по расписанию. Кроме того, после получения запланированного сообщения для полученного сообщения будет установлено свойство scheduleJobId, поэтому имейте это в виду, если вы используете что-то вроде Camel Route, который может автоматически копировать свойства при повторной отправке сообщения.


person aoyuan zhu    schedule 19.04.2017    source источник
comment
ActiveMQ поддерживает отложенную / запланированную доставку, поэтому просто установите правильный параметр при отправке сообщения в AMQ. Вот адаптер очереди Stomp для laravel, который реализует отложенную доставку: github.com/mayconbordin/l5-stomp-queue/blob/master/src/   -  person Lee    schedule 19.04.2017
comment
Хороший ответ! Спасибо.   -  person aoyuan zhu    schedule 19.04.2017
comment
Однако в моем проекте это не работает.   -  person aoyuan zhu    schedule 19.04.2017
comment
возможно, попробуйте запустить phpscript как задачу супервизора (supervisord.org)   -  person gries    schedule 20.04.2017


Ответы (1)


изменить activemq.xml включить брокера schedulerSupport = "true"

eg.

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">

затем перезапустите сервер activemq

person stepreal    schedule 10.04.2019