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的消息都会丢失。这时,可以给异步投递方法接收回调,以确认消息是否发送成功。
延迟投递和定时投递
关于延迟投递,请参考《springBoot整合ActiveMQ实现延时发现消息》。关于定时投递,就是使用定时任务发送消息,这里一笔带过,请自行查阅文档。
文章转发自[1],到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!