ActiveMQ的学习(四)(消息投递方式+死信队列+重发策略)
消息投递方式
投递方式一共有三种:异步投递,延迟投递,定时投递。
异步投递
同步发送:消息生产者使用持久(Persistent)传递模式发送信息的时候,Producer.send()方法会被阻塞,直到broker发送一个确认消息给生产者(ProducerAck),这个确认消息按时broker已经成功接收到消息并把消息保存到二级存储中。
异步发送:如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到broker的确认之前一直阻塞Producer.send方法。
如果想要使用异步,在brokerURL中增加jms.alwaysSyncSend=false&jms.useAsyncSend=true属性
1. 如果设置了alwaysSyncSend=true系统将会忽略useAsyncSend设置的值都采用同步。
2. 当alwaysSyncSend=false时,“NON_PERSISTENT”(非持久化),事务中的消息将使用“异步发送”
3. 当alwaysSyncSend=false时,如果指定了useAsyncSend=true,“PERSISTENT”类型的消息使用异步发送。如果useAsyncSend=false,“PERSISTENT”类型的消息使用同步发送。
总结:默认情况(alwaysSyncSend=false,useAsyncSend=false),非持久化消息,事务内的消息均采用异步发送;对于持久化消息采用同步发送。
异步投递如何确认发送成功:
异步投递丢失消息的场景是:生产者设置UserAsyncSend=true,使用producer.send(msg)持续发送消息。
由于消息不阻塞,生产者会认为所有send的消息均被成功发送至MQ。如果MQ突然宕机,此时生产者端内存中尚未被发送至MQ的消息都会丢失。
这时,可以给异步投递方法接收回调,以确认消息是否发送成功。
延迟投递
生产者提供两个发送消息的方法,一个是即时发送消息,一个是延时发送消息。
延迟投递和定时投递的四个属性
首先修改activemq.xml文件里的属性,添加schedulerSupport=“true”配置
1 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq. data}" schedulerSupport="true" />
之后在代码里设置延时时长
1 message.setLongProperty(ScheduledMessage.AMO_SCHEDULED_DELAY, 10000);//10秒
定时投递
启动类上添加
业务上添加
死信队列
死信队列,用来保存处理失败或者过期的信息。
出现以下情况的时候,消息会被重发:
A transacted session is used and rollback() is called.
A transacted session is closed before commit is called.
A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.
当一个消息被重发超过6次(缺省为6),会给broker发送一个“poison ack”,这个消息被认为是a poison pill,这时broker会将这个消息发送到死信队列,以便后续处理。
注意两点:
1. 缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ。
2. 缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列中。
可以通过配置文件activemq.xml来调整死信发送策略。
为每个队列建立独立得死信队列(下面是queue和topic两种形式,选一种即可)
效果:
还有其他策略,这个要根据实际情况来对应处理。
比如:
非持久消息保存到死信队列
1 <policyEntry queue=">"> 2 <deadLetterStrategy> 3 <sharedDeadLetterStrategy processNonPersistent="true" /> 4 </deadLetterStrategy> 5 </policyEntry>
过期消息不保存到死信队列
1 <policyEntry queue=">"> 2 <deadLetterStrategy> 3 <sharedDeadLetterStrategy processExpired="false" /> 4 </deadLetterStrategy> 5 </policyEntry>
重发策略
RedeliveryPolicy重发策略设置
参考:
1. https://www.cnblogs.com/rainwang/p/5146223.html
2. 黑马程序员得mq教程
持续更新!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!