RabbitMQ 延迟队列,消息延迟推送

本文详细介绍了如何在SpringAMQP中使用延迟队列进行消息传递,包括设置延迟、消息发送和消费的处理,以及与Java面试题中的相关知识点。同时提及了实战项目源码和面试资料链接。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

@Bean

public TopicExchange lazyExchange(){

//Map<String, Object> pros = new HashMap<>();

//设置交换机支持延迟消息推送

//pros.put(“x-delayed-message”, “topic”);

TopicExchange exchange = new TopicExchange(LAZY_EXCHANGE, true, false, pros);

exchange.setDelayed(true);

return exchange;

}

@Bean

public Queue lazyQueue(){

return new Queue(LAZY_QUEUE, true);

}

@Bean

public Binding lazyBinding(){

return BindingBuilder.bind(lazyQueue()).to(lazyExchange()).with(LAZY_KEY);

}

}

我们在 Exchange 的声明中可以设置exchange.setDelayed(true)来开启延迟队列,也可以设置为以下内容传入交换机声明的方法中,因为第一种方式的底层就是通过这种方式来实现的。

//Map<String, Object> pros = new HashMap<>();

//设置交换机支持延迟消息推送

//pros.put(“x-delayed-message”, “topic”);

TopicExchange exchange = new TopicExchange(LAZY_EXCHANGE, true, false, pros);

发送消息时我们需要指定延迟推送的时间,我们这里在发送消息的方法中传入参数 new MessagePostProcessor() 是为了获得 Message对象,因为需要借助 Message对象的api 来设置延迟时间。

import com.anqi.mq.config.MQConfig;

import org.springframework.amqp.AmqpException;

import org.springframework.amqp.core.Message;

import org.springframework.amqp.core.MessageDeliveryMode;

import org.springframework.amqp.core.MessagePostProcessor;

import org.springframework.amqp.rabbit.connection.CorrelationData;

import org.springframework.amqp.rabbit.core.RabbitTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import java.util.Date;

@Component

public class MQSender {

@Autowired

private RabbitTemplate rabbitTemplate;

//confirmCallback returnCallback 代码省略,请参照上一篇

public void sendLazy(Object message){

rabbitTemplate.setMandatory(true);

rabbitTemplate.setConfirmCallback(confirmCallback);

rabbitTemplate.setReturnCallback(returnCallback);

//id + 时间戳 全局唯一

CorrelationData correlationData = new CorrelationData(“12345678909”+new Date());

//发送消息时指定 header 延迟时间

rabbitTemplate.convertAndSend(MQConfig.LAZY_EXCHANGE, “lazy.boot”, message,

new MessagePostProcessor() {

@Override

public Message postProcessMessage(Message message) throws AmqpException {

//设置消息持久化

message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);

//message.getMessageProperties().setHeader(“x-delay”, “6000”);

message.getMessageProperties().setDelay(6000);

return message;

}

}, correlationData);

}

}

我们可以观察 setDelay(Integer i)底层代码,也是在 header 中设置 x-delay。等同于我们手动设置 header

message.getMessageProperties().setHeader(“x-delay”, “6000”);

/**

  • Set the x-delay header.

  • @param delay the delay.

  • @since 1.6

*/

public void setDelay(Integer delay) {

if (delay == null || delay < 0) {

this.headers.remove(X_DELAY);

}

else {

this.headers.put(X_DELAY, delay);

}

}

消费端进行消费

import com.rabbitmq.client.Channel;

import org.springframework.amqp.rabbit.annotation.*;

import org.springframework.amqp.support.AmqpHeaders;

import org.springframework.stereotype.Component;

import java.io.IOException;

import java.util.Map;

@Component

public class MQReceiver {

@RabbitListener(queues = “MQ.LazyQueue”)

@RabbitHandler

public void onLazyMessage(Message msg, Channel channel) throws IOException{

long deliveryTag = msg.getMessageProperties().getDeliveryTag();

channel.basicAck(deliveryTag, true);

System.out.println("lazy receive " + new String(msg.getBody()));

}

测试结果

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
(img-DEYVgHFh-1714647005078)]

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

[外链图片转存中…(img-y7GB73Q3-1714647005078)]

Java高级架构面试知识整理:

[外链图片转存中…(img-dFtuLCu7-1714647005078)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值