springboot集成rabbitmq实现延时消息队列
1、添加依赖
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
2、添加配置信息
# 应用服务 WEB 访问端口 server: port: 8088 spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest virtualHost: /
3、添加队列和交换机配置
package com.liubaihui.springboot3.configure; 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; @Configuration public class TtlQueueConfig { public static final String X_EXCHANGE = "X"; public static final String QUEUE_A = "QA"; public static final String QUEUE_B = "QB"; public static final String Y_DEAD_LETTER_EXCHANGE = "Y"; public static final String DEAD_LETTER_QUEUE = "QD"; // 声明 xExchange @Bean("xExchange") public DirectExchange xExchange(){ return new DirectExchange(X_EXCHANGE); } // 声明 xExchange @Bean("yExchange") public DirectExchange yExchange(){ return new DirectExchange(Y_DEAD_LETTER_EXCHANGE); } // 声明队列 A ttl 为 10s 并绑定到对应的死信交换机 @Bean("queueA") public Queue queueA(){ Map<String, Object> args = new HashMap<>(3); // 声明当前队列绑定的死信交换机 args.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE); // 声明当前队列的死信路由 key args.put("x-dead-letter-routing-key", "YD"); // 声明队列的 TTL args.put("x-message-ttl", 10000); return QueueBuilder.durable(QUEUE_A).withArguments(args).build(); } // 声明队列 A 绑定 X 交换机 @Bean public Binding queueaBindingX(@Qualifier("queueA") Queue queueA, @Qualifier("xExchange") DirectExchange xExchange){ return BindingBuilder.bind(queueA).to(xExchange).with("XA"); } // 声明队列 B ttl 为 40s 并绑定到对应的死信交换机 @Bean("queueB") public Queue queueB(){ Map<String, Object> args = new HashMap<>(3); // 声明当前队列绑定的死信交换机 args.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE); // 声明当前队列的死信路由 key args.put("x-dead-letter-routing-key", "YD"); // 声明队列的 TTL args.put("x-message-ttl", 40000); return QueueBuilder.durable(QUEUE_B).withArguments(args).build(); } // 声明队列 B 绑定 X 交换机 @Bean public Binding queuebBindingX(@Qualifier("queueB") Queue queue1B, @Qualifier("xExchange") DirectExchange xExchange){ return BindingBuilder.bind(queue1B).to(xExchange).with("XB"); } // 声明死信队列 QD @Bean("queueD") public Queue queueD(){ return new Queue(DEAD_LETTER_QUEUE); } // 声明死信队列 QD 绑定关系 @Bean public Binding deadLetterBindingQAD(@Qualifier("queueD") Queue queueD, @Qualifier("yExchange") DirectExchange yExchange){ return BindingBuilder.bind(queueD).to(yExchange).with("YD"); } }

4、创建生产者
@Slf4j @RequestMapping("ttl") @RestController public class SendMsgController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("sendMsg/{message}") public void sendMsg(@PathVariable String message){ log.info(" 当前时间:{}, 发送一条信息给两个 TTL 队列:{}", new Date(), message); rabbitTemplate.convertAndSend("X", "XA", " 消息来自 ttl 为 为 10S 的队列: "+message); rabbitTemplate.convertAndSend("X", "XB", " 消息来自 ttl 为 为 40S 的队列: "+message); } }
5、创建消费者
@Slf4j @Component public class DeadLetterQueueConsumer { @RabbitListener(queues = "QD") public void receiveD(Message message, Channel channel) throws IOException { String msg = new String(message.getBody()); log.info(" 当前时间:{}, 收到死信队列信息{}", new Date().toString(), msg); } }

这种方式不推荐,可以使用下面的方式
这个我没有测试,参考:https://blog.csdn.net/weixin_47314924/article/details/128819735
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号