在RabbitMQ中,队列支持下面几个属性.
x-message-ttl: 10000
表示队列中的消息只能存活10秒,变成死信
无特殊配置时,消息到期将被丢弃.
若不希望死信
直接丢弃,可以通过队列的其他属性进行配置.把死信
转发给另一个交换机
-
x-dead-letter-exchange: myExchange
带有此属性的队列,会把死信
投递给此处设置的myExchange
交换机 -
x-dead-letter-routing-key: myKey
,该属性设置了死信
转发时使用的路由键.
代码实现PHP
定义普通队列时,配置好上述属性
<?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后台,找到我们的普通队列,队列有以下属性


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

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