SpringBoot整合RabbitMQ(死信队列)

104 阅读1分钟

1.png

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

生产消息

@Autowired
private AmqpTemplate amqpTemplate;

@RequestMapping("sendMessage")
@ResponseBody
public void sendMessage(String msg) {
    Map<String, Object> params = new HashMap<>();
    params.put("code", 1);
    params.put("msg", msg);
    amqpTemplate.convertAndSend("demoExchange", "demo.create", JSON.toJSONString(params));
}

监听队列

@Component
@RabbitListener(queues = "deadQueue")
public class Consumer {
    
    @RabbitHandler
    public void queueHandle(String queueMessage, @Headers Map<String, Object> headers, Channel channel) throws IOException {
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
        System.out.println("=====>" + queueMessage);

        // 确认消息
        channel.basicAck(deliveryTag,false);
    }
    
}

配置交换机

@Configuration
public class RabbitmqConfig {

    // 正常交换机
    @Bean
    public Exchange demoExchange() {
        return new TopicExchange("demoExchange");
    }

    // 延时队列
    @Bean
    public Queue demoQueue() {
        Map<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange", "deadExchange");
        map.put("x-dead-letter-routing-key", "deadRouting");
        map.put("x-message-ttl", 30 * 1000);  // 队列设置消息过期时间为 10 秒
        return new Queue("demoQueue", true, false, false, map);
    }

    // 正常交换机和延时队列 绑定
    @Bean
    public Binding demoBinding() {
        return new Binding("demoQueue", Binding.DestinationType.QUEUE, "demoExchange", "demo.create", null);
    }

    // 死信交换机
    @Bean
    DirectExchange deadExchange() {
        return new DirectExchange("deadExchange", true, false);
    }

    // 死信队列
    @Bean
    public Queue deadQueue() {
        return new Queue("deadQueue", true, false, false);
    }

    // 死信交换机和死信队列绑定
    @Bean
    Binding deadRouteBinding() {
        return new Binding("deadQueue", Binding.DestinationType.QUEUE, "deadExchange", "deadRouting", null);
    }
}