在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后台,找到我们的普通队列,队列有以下属性
image.png
再观察发送的消息
初始.png
15秒后消息自动进入死信队列
15秒后.png
通过这个延时机制,可以代替部分定时任务,比如取消15分钟未支付的订单.