tp6.0 rabbitmq死信队列

rabbitMq交换机,队列情况,先手动创建

复制代码
1. 创建普通交换机exchange,普通队列order_queue_expire,队列设置属性:
消息过期时间:60000毫秒,过期绑定dead_exchange交换机,routing_key:dead_queue

2. 创建deal_exchange交换机,dead_queue,通过路由key:dead_queue 绑定




tp6.0为例

生产者

复制代码
    public function producer()
    {
        // 设置队列的TTL和死信交换机
        $deadExchangeName = 'dead_exchange';
        $deadQueueName = 'dead_queue';
        $messageTtl = 1 * 60 * 1000; // 1分钟

        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel();

        //死信交换机和路由
        $tale = new AMQPTable();
        $tale->set('x-dead-letter-exchange', $deadExchangeName);
        $tale->set('x-dead-letter-routing-key', $deadQueueName);
        $tale->set('x-message-ttl', $messageTtl);

        // 声明普通队列
        $queueName = 'order_queue_expire';

        $channel->queue_declare($queueName, false, true, false, false, false,$tale);

        // 将普通队列绑定到普通交换机
        $channel->queue_bind($queueName, 'exchange', $queueName);

        $channel->exchange_declare($deadExchangeName, 'direct', false, true, false);
        $channel->queue_declare($deadQueueName, false, true, false, false);
        $channel->queue_bind($deadQueueName, $deadExchangeName, $deadQueueName);

        for($i = 1000; $i < 1010; $i++) {
            $payload = json_encode(['order_id' => $i]);
            $msg = new AMQPMessage($payload, array('delivery_mode' => 2));
            sleep(1);
            $channel->basic_publish($msg, '', $queueName);
        }

        // 确保在脚本结束时关闭通道和连接
        register_shutdown_function(function () use ($channel, $connection) {
            $channel->close();
            $connection->close();
        });

        dd('ok');
    }

消费者

复制代码
<?php
declare (strict_types = 1);

namespace app\command;

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use think\console\Command;
use think\console\Input;
use think\console\Output;

class Order extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('cancelOrder')
            ->setDescription('the cancelOrder command');
    }

    protected function execute(Input $input, Output $output)
    {
        $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
        $channel = $connection->channel();

        $consumer = new DeadLetterConsumer($connection, $channel, 'dead_queue');

        $consumer->consume(
            function (AMQPMessage $message) {
                $body = $message->getBody();

                echo "Received message: ", $body, "\n";

                sleep(1);
                //$message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
            }
        );

        // 当你完成消费后,关闭连接
        $consumer->close();
    }

}

class DeadLetterConsumer
{
    public function __construct($connection, $channel, $queueName)
    {
        $this->connection = $connection;
        $this->channel = $channel;
        $this->queueName = $queueName;

        $this->channel->queue_declare($queueName, false, true, false, false);
        $this->channel->exchange_declare('dead_exchange', 'direct', false, true, false);

        $this->channel->queue_bind($queueName, 'dead_exchange', 'dead_queue');
    }

    public function consume($callback)
    {
        $this->channel->basic_consume(
            $this->queueName,
            '',
            false,
            true,
            false,
            false,
            $callback
        );

        while (count($this->channel->callbacks)) {
            $this->channel->wait();
        }
    }

    public function close()
    {
        $this->channel->close();
        $this->connection->close();
    }
}
相关推荐
往事随风去2 天前
架构师必备思维:从“任务队列”到“事件广播”,彻底吃透消息队列两大设计模式
消息队列·rabbitmq
虫小宝3 天前
返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
分布式·架构·rabbitmq
无缘之缘3 天前
SpringBoot整合RabbitMQ
spring boot·rabbitmq·java-rabbitmq
葵野寺4 天前
【RelayMQ】基于 Java 实现轻量级消息队列(九)
java·开发语言·rabbitmq·java-rabbitmq
Cxzzzzzzzzzz4 天前
RabbitMQ 在实际开发中的应用场景与实现方案
分布式·rabbitmq
优秀的老黄5 天前
Docker部署RabbitMQ
linux·运维·docker·中间件·容器·centos·rabbitmq
java1234_小锋5 天前
RabbitMQ如何实现消息的持久化?
java·rabbitmq·java-rabbitmq
AD钙奶-lalala5 天前
RabbitMQ的核心使用示例
java·rabbitmq·java-rabbitmq
山城码农笑松哥5 天前
国产凝思debian系Linux离线安装rabbitmq教程步骤
linux·debian·rabbitmq
小句5 天前
RabbitMQ对接MQTT消息发布指南
分布式·rabbitmq·ruby