rabbitMq延时消费
需求:实现消息的延时推送,推送的时间是配置的,如果消息数量少可以简单通过ScheduledExecutorService线程池方式推送,数据量大时,线程不足以存放,可通过rabbitMq延时消费。配置如下
(1)RabbitMQConfig类中添加
@Bean
Queue delayQueuePerMessageTTL() {
return QueueBuilder.durable(DELAY_QUEUE_PER_MESSAGE_TTL_NAME)
.withArgument("x-dead-letter-exchange", DELAY_EXCHANGE_NAME) // DLX,dead letter发送到的exchange
.withArgument("x-dead-letter-routing-key", DELAY_PROCESS_QUEUE_NAME) // dead letter携带的routing key
.build();
}
@Bean
Queue delayProcessQueue() {
return QueueBuilder.durable(DELAY_PROCESS_QUEUE_NAME)
.build();
}
@Bean
DirectExchange delayExchange() {
return new DirectExchange(DELAY_EXCHANGE_NAME);
}
@Bean
Binding dlxBinding(Queue delayProcessQueue, DirectExchange delayExchange) {
return BindingBuilder.bind(delayProcessQueue)
.to(delayExchange)
.with(DELAY_PROCESS_QUEUE_NAME);
}
(2)生产者发送队列 DELAY_QUEUE_PER_MESSAGE_TTL_NAME ,消费者消费队列 DELAY_PROCESS_QUEUE_NAME
(3)生产者代码
AnswerMessage answerMessage = new AnswerMessage();
answerMessage.setStudentAnswer("你好啊");
MyCorrelationData<AnswerMessage> correlationData = new MyCorrelationData<AnswerMessage>();
correlationData.setMessage(answerMessage);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("消息发送时间:"+sdf.format(new Date()));
myRabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME_DIRECT, RabbitMQConfig.DELAY_QUEUE_PER_MESSAGE_TTL_NAME, answerMessage,
new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
// TODO Auto-generated method stub
message.getMessageProperties().setExpiration("60000");
return message;
}
}, correlationData);
(4)消费者代码,类中消费消息,处理。
@Component
@RabbitListener(queues=RabbitMQConfig.DELAY_PROCESS_QUEUE_NAME)
public class DealAnswerListener{
}
(5)具体说明参考 https://www.cnblogs.com/xishuai/p/spring-boot-rabbitmq-delay-queue.html
浙公网安备 33010602011771号