rabbitMQ死信对列

rabbitMQ死信对列

生产者

package com.xiangxue.jack.pushpull;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.util.HashMap;
import java.util.Map;

/**
 * @Classname Producer
 * @Description TODO
 * @Author hdk
 * Date 2020/9/23 18:01
 * Version 1.0
 * 将超时的信息放到死信队列中,另外处理
 */
public class Producer {
    public static void main(String[] args) throws Exception {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        // 声明一个接收被删除的消息的交换机和队列
        String EXCHANGE_DEAD_NAME = "exchange.dead";
        String QUEUE_DEAD_NAME = "queue_dead";
        channel.exchangeDeclare(EXCHANGE_DEAD_NAME, BuiltinExchangeType.DIRECT);
        // 声明一个队列,主题名,是否队列持久化,是否排外(只能本次连接访问),自动删除,
        channel.queueDeclare(QUEUE_DEAD_NAME, false, false, false, null);
        channel.queueBind(QUEUE_DEAD_NAME, EXCHANGE_DEAD_NAME, "routingkey.dead");
        String EXCHANGE_NAME = "exchange.direct";
        String QUEUE_NAME = "queue_name";
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        Map<String, Object> arguments = new HashMap<String, Object>();
        // 统一设置队列中的所有消息的过期时间
        arguments.put("x-message-ttl", 60000000);
        // 设置超过多少毫秒没有消费者来访问队列,就删除队列的时间
        arguments.put("x-expires", 20000000);
        // 设置队列的最新的N条消息,如果超过N条,前面的消息将从队列中移除掉
        arguments.put("x-max-length", 5);
        // 设置队列的内容的最大空间,超过该阈值就删除之前的消息
        arguments.put("x-max-length-bytes", 1024);
        // 将删除的消息推送到指定的交换机,一般x-dead-letter-exchange和x-dead-letter-routing-key需要同时设置
        arguments.put("x-dead-letter-exchange", "exchange.dead");
        // 将删除的消息推送到指定的交换机对应的路由键
        arguments.put("x-dead-letter-routing-key", "routingkey.dead");
        // 设置消息的优先级,优先级大的优先被消费 arguments.put("x-max-priority", 10);
        channel.queueDeclare(QUEUE_NAME, false, false, false, arguments);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
        String message = "Hello RabbitMQ: ";
        for (int i = 1; i <= 5; i++) {
            // expiration: 设置单条消息的过期时间
            AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties().builder().priority(i).expiration(i + 10 + "").deliveryMode(2);
            channel.basicPublish(EXCHANGE_NAME, "", properties.build(), (message + i).getBytes("UTF-8"));
        }
        channel.close();
        connection.close();
    }
}

消费者

package com.xiangxue.jack.pushpull;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Classname PushConsumer
 * @Description TODO
 * @Author hdk
 * Date 2020/9/23 17:55
 * Version 1.0
 */
public class PushConsumer {
    public static void main(String[] args) throws Exception {
        Connection connection = RabbitUtils.getConnection();
        final Channel channel = connection.createChannel();
        Map<String, Object> arguments = new HashMap<String, Object>();
        // 统一设置队列中的所有消息的过期时间
        arguments.put("x-message-ttl", 120000);
        // 设置超过多少毫秒没有消费者来访问队列,就删除队列的时间
        arguments.put("x-expires", 20000000);
        // 设置队列的最新的N条消息,如果超过N条,前面的消息将从队列中移除掉
        arguments.put("x-max-length", 5);
        // 设置队列的内容的最大空间,超过该阈值就删除之前的消息
        arguments.put("x-max-length-bytes", 1024);
        // 将删除的消息推送到指定的交换机,一般x-dead-letter-exchange和x-dead-letter-routing-key需要同时设置
        arguments.put("x-dead-letter-exchange", "exchange.dead");
        // 将删除的消息推送到指定的交换机对应的路由键
        arguments.put("x-dead-letter-routing-key", "routingkey.dead");
        // 设置消息的优先级,优先级大的优先被消费 arguments.put("x-max-priority", 10);
       // channel.queueDeclare(RabbitConstant.QUEUE_DEAD, false, false, false, arguments);
        //queueBind用于将队列与交换机绑定
        //参数1:队列名 参数2:交互机名  参数三:路由key(暂时用不到)
       channel.queueBind(RabbitConstant.QUEUE_DEAD, RabbitConstant.EXCHANGE_DIRECT, "");
        channel.basicQos(2);

        channel.basicConsume(RabbitConstant.QUEUE_DEAD, false, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
              //  final String s = new String(body);
           //     if(s.contains("RabbitMQ: 2")){
//                    try {
//                        System.out.println("111");
//                        Thread.sleep(5000);
//                        System.out.println("2222");
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
               //    return;
              //  }
                System.out.println(Thread.currentThread().getId()+"接收到的消息:" + new String(body));
                    channel.basicAck(envelope.getDeliveryTag(), false);

            }
        });
    }
}

posted on 2021-08-02 10:43  wolf12  阅读(51)  评论(0)    收藏  举报