【发布时间】:2017-09-15 16:43:14
【问题描述】:
我正在使用基于 php.And Stomp+activeMQ 的 laravel 框架。 这里我需要向 mq 发送一些东西,但是消息应该在 180 秒后被消费,而不是立即消费。
选项1,我发送带有时间戳,消费者会检查时间戳。如果间隔> 180,则做一些事情并ack()。
选项 1 效率低下,消费者每时每刻都在检查时间戳,但很少有消息被确认。
选项2,shell_exec("php send.php | at now + 3 minute"),看起来很奇怪。
有没有更好的解决方案?
我已经按照 Lee 的建议设置了“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);
我记得在 activemq.xml 中设置 schedulerSupport=true。
我指的是这个:ActiveMq Doc,这个有关系吗?我不知道。或者可以在标头中发送“AMQ_SCHEDULED_DELAY”吗?因为ActiveMq Doc: Stomp 没有将其列为标头。
检查您的消息属性 消息属性 scheduleJobId 保留供 Job Scheduler 使用。如果在发送之前设置了该属性,则消息将立即发送而不是计划发送。此外,在接收到预定消息后,将在接收到的消息上设置属性 scheduleJobId,因此如果使用像 Camel Route 这样的东西可能会在重新发送消息时自动复制属性,请记住这一点。
【问题讨论】:
-
ActiveMQ 支持延迟/定时投递,所以发送消息到 AMQ 时只要设置正确的选项即可。这是一个实现延迟交付的 laravel stomp 队列适配器:github.com/mayconbordin/l5-stomp-queue/blob/master/src/…
-
不错的答案!谢谢。
-
但是,它在我的项目中不起作用。悲伤
-
也许尝试将 phpscript 作为主管任务运行 (supervisord.org)
标签: php delay message-queue stomp