Я использую фреймворк 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, который может автоматически копировать свойства при повторной отправке сообщения.