php rabbitmq延时队列,如何使用PHP的RabbitMQ延迟消息队列?

我正在尝试从PHP使用Delayed Message Queue for RabbitMQ,但我的消息正在消失.

我用以下代码声明交换:

$this->channel->exchange_declare(

'delay',

'x-delayed-message',

false, /* passive, create if exchange doesn't exist */

true, /* durable, persist through server reboots */

false, /* autodelete */

false, /* internal */

false, /* nowait */

['x-delayed-type' => ['S', 'direct']]);

我用这段代码绑定队列:

$this->channel->queue_declare(

$queueName,

false, /* Passive */

true, /* Durable */

false, /* Exclusive */

false /* Auto Delete */

);

$this->channel->queue_bind($queueName, "delay", $queueName);

我正在使用以下代码发布消息:

$msg = new AMQPMessage(json_encode($msgData), [

'delivery_mode' => 2,

'x-delay' => 5000]);

$this->channel->basic_publish($msg, 'delay', $queueName);

但消息不会延迟;它仍然立即交付.我错过了什么?

解决方法:

消息创建应该是

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Message\AMQPMessage;

use PhpAmqpLib\Wire\AMQPTable;

$msg = new AMQPMessage($data,

array(

'delivery_mode' => 2, # make message persistent

'application_headers' => new AMQPTable([

'x-delay' => 5000

])

)

);

标签:php,rabbitmq,php-amqplib

来源: https://codeday.me/bug/20190727/1557763.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
延时队列RabbitMQ 中的一个常见概念,它允许消息在一段延时后才会被消费者消费。这在某些场景下非常有用,例如需要在未来的某个特定时间才执行某个任务。 在 RabbitMQ 中实现延时队列有几种方法,其中最常用的方法是使用插件 `rabbitmq_delayed_message_exchange`。这个插件允许你创建一个特殊的交换机,它支持对消息设置延时时间,然后将消息路由到延迟队列中。 具体实现步骤如下: 1. 确保你已经安装了 `rabbitmq_delayed_message_exchange` 插件。如果没有安装,可以通过运行 `rabbitmq-plugins enable rabbitmq_delayed_message_exchange` 命令来安装。 2. 创建一个类型为 `x-delayed-message` 的交换机,并将其配置为使用 `rabbitmq_delayed_message_exchange` 插件。你可以使用 RabbitMQ 的管理界面或者命令行工具来创建交换机。 3. 创建一个普通的队列,并将其绑定到延迟交换机上。 4. 在生产者发送消息时,设置消息的 `x-delay` 头部属性来指定延迟时间,单位是毫秒。消息会被发送到延迟交换机,并根据延迟时间被路由到延迟队列中。 5. 消费者从延迟队列中消费消息,延迟时间到达后才能获取到消息。 需要注意的是,延时队列并不是 RabbitMQ 的原生特性,而是通过插件来实现的。因此,在使用延时队列之前,你需要确保 RabbitMQ 已经安装了相应的插件。 希望这个回答对你有帮助。如果你还有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值