MQ安装教程

https://blog.csdn.net/L630642270/article/details/126767808

安装RabbitMQ的延迟插件

1.下载:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.9.0/rabbitmq_delayed_message_exchange-3.9.0.ez
2.将插件文件复制到RabbitMQ安装目录的plugins目录下:
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.11/plugins
3.进入RabbitMQ安装目录的sbin目录下,使用如下命令启用延迟插件
// 进入目录
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.11/sbin
// 启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

Maven依赖

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

配置文件

# 应用名称
spring.application.name=rabbitMq
# 应用服务 WEB 访问端口
server.port=8080
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# 开启消息确认机制 confirm 异步
spring.rabbitmq.publisher-confirm-type=correlated
# 之前的旧版本 开启消息确认机制的方式
# spring.rabbitmq.publisher-confirms=true
# 开启return机制
spring.rabbitmq.publisher-returns=true
# 消息开启手动确认
spring.rabbitmq.listener.direct.acknowledge-mode=manual
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 消费者每次从队列获取的消息数量。此属性当不设置时为:轮询分发,设置为1为:公平分发
spring.rabbitmq.listener.simple.prefetch=1
# 是否支持重试
spring.rabbitmq.listener.simple.retry.enabled=true#消费者最小数量
spring.rabbitmq.listener.simple.concurrency=1
#消费之最大数量
spring.rabbitmq.listener.simple.max-concurrency=10

常量池

/*** @AUTHOR Summer* @DATE 2022-06-28 15:19*/
public interface Consts {// 延迟交换机String COURSE_TASK_DELAY_EXCHANGE = "course.task.delayExchange";// 延迟队列String COURSE_TASK_DELAY_QUEUE = "course.task.delayQueue";
}

MQ配置

/*** @AUTHOR Summer* @DATE 2022-08-23 10:22*/
@Configuration
public class RabbitmqConfig {@Beanpublic CustomExchange delayExchange() {Map<String, Object> args = new HashMap<>(1);args.put("x-delayed-type", "direct");return new CustomExchange(Consts.COURSE_TASK_DELAY_EXCHANGE, "x-delayed-message", true, false, args);}/*** 延时队列*  DLX方式* @return*/@Beanpublic Queue immediateQueue() {// 第一个参数是创建的queue的名字,第二个参数是是否支持持久化return new Queue(Consts.COURSE_TASK_DELAY_QUEUE, true);}/*** 给延时队列绑定交换机*   DLX方式* @return*/@Beanpublic Binding bindingNotify() {return BindingBuilder.bind(immediateQueue()).to(delayExchange()).with(Consts.COURSE_TASK_DELAY_EXCHANGE).noargs();}
}

生产者

@Autowired
private RabbitTemplate rabbitTemplate;public void sendMqMessage(){User user = new User(1,"张三");// rabbitTemplate.setMandatory(true);// rabbitTemplate.setConfirmCallback(confirmCallback);CorrelationData correlationData = new CorrelationData("confirm-" + System.currentTimeMillis());rabbitTemplate.convertAndSend(Consts.COURSE_TASK_DELAY_EXCHANGE,Consts.COURSE_TASK_DELAY_EXCHANGE,user,message -> {// 根据业务修改时间Integer taskDuration = 5000; // 毫秒message.getMessageProperties().setDelay(taskDuration);  // 毫秒return message;},correlationData);
}

消费者

/*** @AUTHOR Summer* @DATE 2022-08-19 15:48*/
@Slf4j
@Component
public class CourseComsumer {@Autowiredprivate CourseActivityUserService courseActivityUserService;/*** 延迟队列-消费方* @return* @author Summer* @date 2022-08-23 11:58*/@RabbitListener(queues = Consts.COURSE_TASK_DELAY_QUEUE)public void getDLXMessage(User user, Channel channel, Message message) throws IOException {try {channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);log.error("DLX延迟队列消息:{}",user);} catch (IOException e) {if (message.getMessageProperties().getRedelivered()) {log.error("DLX延迟队列消息已重复处理失败,拒绝再次接收...");// 拒绝消息//basicReject:拒绝消息,与basicNack区别在于不能进行批量操作,其他用法很相似。//deliveryTag:表示消息投递序号。//requeue:值为 true 消息将重新入队列。channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);} else {log.error("DLX延迟队列消息即将再次返回队列处理...");//basicNack :表示失败确认,一般在消费消息业务异常时用到此方法,可以将消息重新投递入队列。//deliveryTag:表示消息投递序号。//multiple:是否批量确认。//requeue:值为 true 消息将重新入队列。channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);}}}
}

SpringBoot Rabbitmq3.9 DLX方式实现延迟队列相关推荐

  1. RabbitMQ实现延迟队列的方式

    1.背景 最近在做类似拍卖系统的上架功能,卖家上架物品以后,例如到期时间24小时或者48小时,如果无竞拍者或者购买者,则物品自动下架到用户的邮件中.诸如电商用户下单,30分钟未支付,则自动取消订单,归 ...

  2. RabbitMQ如何实现延迟队列?

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. 完整案例:实现延迟队列的两种方法

    延迟队列是指把当前要做的事情,往后推迟一段时间再做. 延迟队列在实际工作中和面试中都比较常见,它的实现方式有很多种,然而每种实现方式也都有它的优缺点,接下来我们来看. 延迟队列的使用场景 延迟队列的常 ...

  4. 你真的知道怎么实现一个延迟队列吗?

    原文地址:https://mp.weixin.qq.com/s/jL8_23pjYWV74rsjoWNPWg 目录 前言 延迟队列定义 应用场景 实现方案 Redis zset TimeWheel 时 ...

  5. SpringBoot之使用RabbitMQ实现延迟队列

    在我们的各个项目中,经常会有这样的需求. 订单模块:在订单下单后30分钟如果没有付款,就自动取消订单, 短信模块:在下单成功后60s给用户发送短信通知 支付模块:在微信/支付宝支付成功后,1分钟后去调 ...

  6. RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列

    搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...

  7. SpringBoot整合RabbitMQ 消息可靠投递、手动ack、延迟队列、死信队列、消息幂等性保障、消息积压

    1.消息可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 ...

  8. SpringBoot RabbitMQ 延迟队列代码实现

    场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://ww ...

  9. SpringBoot RabbitMQ 集成 七 延迟队列

    为什么80%的码农都做不了架构师?>>>    何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列.而一般的队列,消息一旦入队了之后就会被消费者马上消费. 延迟 ...

最新文章

  1. 这样写交互说明,开发不会约你去爬山~
  2. 中单引号怎么打出来_打新股中什么是暗盘交易?招股资讯怎么看
  3. hadoop集群中datanode启动几秒钟自动关闭
  4. JAVA中randomfile_java中的RandomAccessFile的用法
  5. axios.delete()请求方式(含代码)- 应用篇
  6. php设置页面最小高度,HTML_CSS布局中最小高度的妙用,最小高度可以设定一个BOX的最 - phpStudy...
  7. js学习总结----js中常用的四种输出方式
  8. “同一天生日”网络募捐被疑造假,为什么却成了程序员的锅?
  9. Python_遍历时删除的处理说明
  10. magento xml配置详解(1)
  11. 2019年密码与安全新技术讲座-课程总结报告
  12. imx6 android 最新,【iMX6Q-Android6.0】---移植 iMX6Q android6.0 源码 史上最详细
  13. Unity2d 坦克大战 (二)道具效果实现
  14. 初级网优工程师需要符合什么标准?华为初级认证重点知识!
  15. 协同办公OA业务系统数据集成(4)-前端业务流程数据接口调用
  16. java实现奖学金申请,基于ssm+mysql的web助学金申请系统[实现过程记录]
  17. 动态半透膜背景的热气球漂浮登陆界面 很赞
  18. css样式字体文本汇总
  19. 自由职业者:提高效率的6个简单方法
  20. 关于github双因素验证问题解决方案

热门文章

  1. Tomcat环境变量配置及安装过程中错误解决方法记录
  2. jeecg-boot登录页,首页修改标题栏及其他
  3. C/C++ 中‘0’ “0” ‘\0’ 0的辨析
  4. 2023全球智博会奏响AI产业发展的四重共振
  5. Linux离线部署epel源
  6. 微信小程序网悦新闻开发--我的模块开发(五)
  7. 另一个 OleDbParameterCollection 中已包含 OleDbParameter
  8. Python_正则表达式提取字符串
  9. python 实现线程的暂停, 恢复, 退出详解及实例
  10. offsetParent 深度解析