ActiveMQ消息投递方式之异步投递【转】

  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],到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!

Reference

[1]https://www.cnblogs.com/flyinghome/p/12316403.html

 

posted @ 2020-09-25 10:17  楼兰胡杨  阅读(390)  评论(0编辑  收藏  举报