SpringBoot整合RabbitMQ之死信队列

221 阅读1分钟

一、yml配置

server:
  port: 8021
spring:
  application:
    # 项目名称
    name: rabbitmq-provider
  # 配置 RabbitMQ 服务器
  rabbitmq:
    host: 192.168.68.68
    port: 5672
    username: guest
    password: guest
    # 虚拟host 可以不设置,使用server默认host/
    virtual-host: /

二、死信队列配置文件

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * 死信队列实现步骤:
 *     1、声明正常的队列(delayed_queue)和交换机(delayed_exchange)
 *     2、声明死信队列(dead_letter_queue)和死信交换机(dead_letter_exchange)
 *     3、正常队列绑定死信交换机
 *         需设置两个参数:
 *             x-dead-letter-exchange:死信交换机名称
 *             x-dead-letter-routing-key:发送给死信交换机的 routingkey
 *         设置信息失效时间(毫秒):
 *             x-message-ttl
 */
@Configuration
public class DelayedRabbitConfig {

    public static final String DELAYED_QUEUE = "delayed_queue";
    public static final String DELAYED_EXCHANGE = "delayed_exchange";
    public static final String DEAD_LETTER_QUEUE = "dead_letter_queue";
    public static final String DEAD_LETTER_EXCHANGE = "dead_letter_exchange";

    /**
     * 正常队列
     */
    @Bean
    public Queue delayedQueue() {
        Map<String, Object> argumentsMap = new HashMap<>();
        // 死信交换机名称
        argumentsMap.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);
        // 发送给死信交换机的 routingkey
        argumentsMap.put("x-dead-letter-routing-key", "dead.letter.123123");
        // 设置队列中的信息过期时间(单位为毫秒) 这里设置10秒
        argumentsMap.put("x-message-ttl", 10000);
        return QueueBuilder.durable(DELAYED_QUEUE).withArguments(argumentsMap).build();
    }

    /**
     * 正常交换机
     */
    @Bean
    public Exchange delayedExchange() {
        return ExchangeBuilder.topicExchange(DELAYED_EXCHANGE).durable(true).autoDelete().build();
    }

    // 正常的队列及交换机进行绑定
    @Bean
    public Binding bindingQueueExchange(@Qualifier("delayedQueue") Queue queue, @Qualifier("delayedExchange") Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("delayed.#").noargs();
    }

    /**
     * 死信队列
     */
    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable(DEAD_LETTER_QUEUE).build();
    }

    /**
     * 死信交换机
     */
    @Bean
    public Exchange deadLetterExchange() {
        return ExchangeBuilder.topicExchange(DEAD_LETTER_EXCHANGE).durable(true).autoDelete().build();
    }

    // 死信队列及死信交换机进行绑定
    @Bean
    public Binding bindingQueueExchangeDlx(@Qualifier("deadLetterQueue") Queue queue, @Qualifier("deadLetterExchange") Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("dead.letter.#").noargs();
    }

}

三、测试

/**
 * 发送测试死信队列
 */
@Test
void testSendDealMessage() {
    rabbitTemplate.convertAndSend(DelayedRabbitConfig.DELAYED_EXCHANGE,
            "delayed.message",
            "我是一个死信信息,嘎嘎嘎嘎嘎");
}