【问题标题】:PHP+Stomp+ActiveMq, "AMQ_SCHEDULED_DELAY" not workingPHP+Stomp+ActiveMq,“AMQ_SCHEDULED_DELAY”不工作
【发布时间】: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


【解决方案1】:

编辑 activemq.xml 启用代理 schedulerSupport="true"

例如。

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

然后重启你的activemq服务器

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 2015-10-12
    • 2012-11-03
    • 2015-07-02
    • 2017-03-06
    • 2015-04-06
    • 2013-02-02
    • 2014-05-31
    • 2020-06-21
    相关资源
    最近更新 更多