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();
    }
}
相关推荐
AC赳赳老秦7 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
invicinble1 天前
关于Rabbitmq在逻辑主体层面的配置
spring boot·rabbitmq·java-rabbitmq
I_Jln.1 天前
RabbitMQ+SpringAMQP 从入门到精通
分布式·rabbitmq
编程彩机2 天前
互联网大厂Java面试:从Spring Boot到消息队列的技术场景解析
java·spring boot·分布式·面试·kafka·消息队列·rabbitmq
洛阳纸贵2 天前
JAVA高级工程师--RabbitMQ消费者消息限流、超时、死信队列以及若依集成升级
java·rabbitmq·java-rabbitmq
福赖2 天前
《微服务即使通讯中RabbitMQ的作用》
c++·微服务·架构·rabbitmq
h7ml3 天前
基于 RabbitMQ 构建异步化淘客订单处理流水线:解耦、削峰与失败重试
分布式·rabbitmq·ruby
小北方城市网4 天前
Spring Boot Actuator+Prometheus+Grafana 生产级监控体系搭建
java·spring boot·python·rabbitmq·java-rabbitmq·grafana·prometheus
不想写bug呀5 天前
RabbitMQ集群和仲裁队列
rabbitmq·集群·仲裁队列
信创天地5 天前
国产化数据库深度运维:性能调优与故障排查实战指南
运维·数据库·安全·elk·自动化·rabbitmq