php rabbitmq 长连接,php RabbitMQ延时队列,死信队列

在RabbitMQ中,队列支持下面几个属性.

x-message-ttl: 10000 表示队列中的消息只能存活10秒,变成死信无特殊配置时,消息到期将被丢弃.

若不希望死信直接丢弃,可以通过队列的其他属性进行配置.把死信转发给另一个交换机

x-dead-letter-exchange: myExchange带有此属性的队列,会把死信投递给此处设置的myExchange交换机

x-dead-letter-routing-key: myKey,该属性设置了死信转发时使用的路由键.

代码实现PHP

定义普通队列时,配置好上述属性

namespace rabbitmq;

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

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

use PhpAmqpLib\Wire\AMQPTable;

header('Content-Type: text/html; charset=gb2312');

try{

//连接

$connection = new AMQPStreamConnection('xxx.com', 5672, 'admin', 123456,'/',true);

$channel = $connection->channel();

//普通交换机

$channel->exchange_declare('PHP-Direct-Exchange','direct');

//定义普通队列

$channel->queue_declare(

'PHP-Queue',

false,

true,

false,

false,

false,

new AMQPTable([

'x-message-ttl'=>15000,

'x-dead-letter-exchange'=>'PHP-Dead-Exchange',

'x-dead-letter-routing-key'=>'PHP-Dead-Key'

])

);

//绑定

$channel->queue_bind('PHP-Queue','PHP-Direct-Exchange','key');

//死信交换机

$channel->exchange_declare('PHP-Dead-Exchange','direct');

//死信队列

$channel->queue_declare('PHP-Dead-Queue');

//死信绑定

$channel->queue_bind('PHP-Dead-Queue','PHP-Dead-Exchange','PHP-Dead-Key');

//向普通队列发送消息

$message = new AMQPMessage('hello world');

$channel->basic_publish($message,'PHP-Direct-Exchange','key',true);

$channel->close();

$connection->close();

}catch (\Exception $exception){

echo "异常信息".$exception->getMessage();

}

运行脚本,打开RabbitMQ后台,找到我们的普通队列,队列有以下属性

829f41b0700e

image.png

再观察发送的消息

829f41b0700e

初始.png

15秒后消息自动进入死信队列

829f41b0700e

15秒后.png

通过这个延时机制,可以代替部分定时任务,比如取消15分钟未支付的订单.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值