- 导入maven依赖,添加配置properties
- 创建延迟队列的config,包括但不限于声明交换机、声明队列、绑定。
- 创建生产者,以SpringBoot Controller为例
- 创建消费者
1.添加配置properties
参考
配置properties
2.创建延迟队列的config
@Configuration
public class DelayedQueueConfig {
//延迟交换机
public static final String DELAYED_EXCHANGE_NAME = "delayedExchange";
//延迟队列
public static final String DELAYED_QUEUE_NAME = "delayedQueue";
//routingKey
public static final String DELAYED_ROUTING_KEY = "routingKey";
//声明交换机 基于插件
@Bean
public CustomExchange delayedExchange(){
Map<String,Object> argument = new HashMap<>();
argument.put("x-delayed-type","direct");
/**
* 1.交换机名字
* 2.交换机类型
* 3.是否需要持久化
* 4.是否需要自动删除
* 5.其他参数
*/
return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message",true,false,argument);
}
//声明队列
@Bean
public Queue delayedQueue(){
return new Queue(DELAYED_QUEUE_NAME);
}
//绑定
@Bean
public Binding delayedQueueBindingDelayedExchange(){
return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(DELAYED_ROUTING_KEY).noargs();
}
}
3.创建生产者
@Slf4j
@RestController
@RequestMapping("/ttl")
public class SendMessageController {
@Resource
private RabbitTemplate rabbitTemplate;
@GetMapping("/sendExpirationMsg/{message}/{delayedTime}")
public void sedMsg(@PathVariable String message,@PathVariable Integer delayedTime){
log.info("发送消息时间{},延迟时间为{}ms,消息为{}",new Date().toString(),delayedTime,message);
/**
* 1.交换机
* 2.routingKey
* 3.消息
* 4.其他配置
*/
rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME,
DelayedQueueConfig.DELAYED_ROUTING_KEY,message,msg->{
//发送消息的延迟时长 单位:ms
msg.getMessageProperties().setDelay(delayedTime);
return msg;
});
}
}
4.创建消费者
@Slf4j
@Component
public class DelayedQueueConsumer {
@RabbitListener(queues=DelayedQueueConfig.DELAYED_QUEUE_NAME)
public void receiveDelayedQueue(Message message){
String msg = new String(message.getBody());
log.info("当前时间:{},收到的消息:{}",new Date().toString(),msg);
}
}
5.输出结果
输入1:http://localhost:8081/demo/ttl/sendExpirationMsg/message1/20000
输入2:http://localhost:8081/demo/ttl/sendExpirationMsg/message2/2000
输出:
发送消息时间Sat Sep 24 15:17:57 CST 2022,延迟时间为20000ms,消息为message1
发送消息时间Sat Sep 24 15:18:04 CST 2022,延迟时间为2000ms,消息为message2
当前时间:Sat Sep 24 15:18:06 CST 2022,收到的消息:message2
当前时间:Sat Sep 24 15:18:17 CST 2022,收到的消息:message1