摘要:異步發(fā)送不會(huì)在受到的確認(rèn)之前一直阻塞方法。方法成功返回意味著所有的持久消息都以被寫到二級(jí)存儲(chǔ)中??偨Y(jié)默認(rèn)情況,非持久化消息事務(wù)內(nèi)的消息均采用異步發(fā)送對(duì)于持久化消息采用同步發(fā)送。
ActiveMq事務(wù)
ActiveMq事務(wù)的作用就是在發(fā)送、接收處理消息過(guò)程中,如果出現(xiàn)問(wèn)題,可以回滾。
ActiveMq異步/同步發(fā)送以下摘抄自https://blog.csdn.net/songhai...
同步發(fā)送:
消息生產(chǎn)者使用持久(persistent)傳遞模式發(fā)送消息的時(shí)候,Producer.send() 方法會(huì)被阻塞,直到 broker 發(fā)送一個(gè)確認(rèn)消息給生產(chǎn)者(ProducerAck),這個(gè)確認(rèn)消息暗示broker已經(jīng)成功接收到消息并把消息保存到二級(jí)存儲(chǔ)中。
異步發(fā)送
如果應(yīng)用程序能夠容忍一些消息的丟失,那么可以使用異步發(fā)送。異步發(fā)送不會(huì)在受到 broker 的確認(rèn)之前一直阻塞 Producer.send 方法。
當(dāng)發(fā)送方法在一個(gè)事務(wù)上下文中時(shí),被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味著所有的持久消息都以被寫到二級(jí)存儲(chǔ)中。
想要使用異步,在brokerURL中增加 jms.alwaysSyncSend=false&jms.useAsyncSend=true
如果設(shè)置了alwaysSyncSend=true系統(tǒng)將會(huì)忽略u(píng)seAsyncSend設(shè)置的值都采用同步
???? 1) 當(dāng)alwaysSyncSend=false時(shí),“NON_PERSISTENT”(非持久化)、事務(wù)中的消息將使用“異步發(fā)送”
???? 2) 當(dāng)alwaysSyncSend=false時(shí),如果指定了useAsyncSend=true,“PERSISTENT”類型的消息使用異步發(fā)送。如果useAsyncSend=false,“PERSISTENT”類型的消息使用同步發(fā)送。
總結(jié):默認(rèn)情況(alwaysSyncSend=false,useAsyncSend=false),非持久化消息、事務(wù)內(nèi)的消息均采用異步發(fā)送;對(duì)于持久化消息采用同步發(fā)送。
?? jms.sendTimeout:發(fā)送超時(shí)時(shí)間,默認(rèn)等于0,如果jms.sendTimeout>0將會(huì)忽略(alwaysSyncSend、useAsyncSend、消息是否持久化)所有的消息都是用同步發(fā)送!
官方連接:http://activemq.apache.org/as...
配置使用異步發(fā)送方式1.在連接上配置
cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true");
2.通過(guò)ConnectionFactory
((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);
3.通過(guò)connection
((ActiveMQConnection)connection).setUseAsyncSend(true);
1.如果在配置中使用了連接池,那么SpringBoot默認(rèn)會(huì)使用PooledConnectionFactory,ActiveMQConnectionFactory的useAsyncSend默認(rèn)會(huì)true。使用連接池配置如下
activemq: in-memory: true broker-url: tcp://127.0.0.1:61616 pool: enabled: true max-connections: 5 user: password:
2.修改JmsTemplate 默認(rèn)參數(shù)
JmsTemplate template = new JmsTemplate(pooledConnectionFactory); //設(shè)備為true,deliveryMode, priority, timeToLive等設(shè)置才會(huì)起作用 template.setExplicitQosEnabled(true); //設(shè)為非持久化模式 template.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
完整代碼如下:
@Slf4j @Configuration public class ActiveConfig { /** * 配置用于異步發(fā)送的非持久化JmsTemplate */ @Autowired @Bean @Primary public JmsTemplate asynJmsTemplate(PooledConnectionFactory pooledConnectionFactory) { JmsTemplate template = new JmsTemplate(pooledConnectionFactory); template.setExplicitQosEnabled(true); template.setDeliveryMode(DeliveryMode.NON_PERSISTENT); log.info("jsmtemplate ------------->sessionTransacted:{}",template.isSessionTransacted()); log.info("jsmtemplate ------------->ExplicitQosEnabled:{}",template.isExplicitQosEnabled()); return template; } /** * 配置用于同步發(fā)送的持久化JmsTemplate */ @Autowired @Bean public JmsTemplate synJmsTemplate(PooledConnectionFactory pooledConnectionFactory) { JmsTemplate template = new JmsTemplate(pooledConnectionFactory); log.info("jsmtemplate ------------->sessionTransacted:{}",template.isSessionTransacted()); log.info("jsmtemplate ------------->ExplicitQosEnabled:{}",template.isExplicitQosEnabled()); return template; } //如果對(duì)于SpringBoot自動(dòng)生成的PooledConnectionFactory需要調(diào)優(yōu),可以自己生PooledConnectionFactory調(diào)優(yōu)參數(shù) // private PooledConnectionFactory getPooledConnectionFactory(String userName,String password,String brokerURL) { // ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName,password,brokerURL); // ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy(); // activeMQConnectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy); // PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(activeMQConnectionFactory); // pooledConnectionFactory.setMaxConnections(5); // return pooledConnectionFactory; // }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72773.html
摘要:本文主要講述消息服務(wù)在中的使用。所以需要一個(gè)監(jiān)聽容器工廠的概念,即接口,它會(huì)引用上面創(chuàng)建好的與的連接工廠,由它來(lái)負(fù)責(zé)接收消息以及將消息分發(fā)給指定的監(jiān)聽器。為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog> 本文所有服務(wù)均采用doc...
摘要:介紹它是出品,最流行的,能力強(qiáng)勁的開源消息總線。是一個(gè)完全支持和規(guī)范的實(shí)現(xiàn),盡管規(guī)范出臺(tái)已經(jīng)是很久的事情了,但是在當(dāng)今的應(yīng)用中間仍然扮演著特殊的地位。相關(guān)文章整合使用整合使用關(guān)注我轉(zhuǎn)載請(qǐng)務(wù)必注明原創(chuàng)地址為安裝同之前一樣,直接在里面玩吧。 showImg(https://segmentfault.com/img/remote/1460000012996066?w=1920&h=1281)...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。這個(gè)時(shí)候,可以啟動(dòng)多臺(tái)積分系統(tǒng),來(lái)同時(shí)消費(fèi)這個(gè)消息中間件里面的登錄消息,達(dá)到橫向擴(kuò)展的作用。 時(shí)間:2017年07月22日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:學(xué)習(xí)消息隊(duì)列的使用之前,我們先來(lái)搞清。是操作消息的接口。消息生產(chǎn)者由創(chuàng)建,并用于將消息發(fā)送到。接收消息打印結(jié)果這是接收到的消息消費(fèi)者啟動(dòng)。。。。 通過(guò)上一篇文章 《消息隊(duì)列深入解析》,我們已經(jīng)消息隊(duì)列是什么、使用消息隊(duì)列的好處以及常見消息隊(duì)列的簡(jiǎn)單介紹。 這一篇文章,主要帶大家詳細(xì)了解一下消息隊(duì)列ActiveMQ的使用。 學(xué)習(xí)消息隊(duì)列ActiveMQ的使用之前,我們先來(lái)搞清JMS。 J...
摘要:消費(fèi)者,監(jiān)聽生產(chǎn)者往指定目的地發(fā)送消息后,接下來(lái)就是消費(fèi)者對(duì)指定目的地的消息進(jìn)行消費(fèi)了。它不會(huì)動(dòng)態(tài)的適應(yīng)運(yùn)行時(shí)需要和參與外部的事務(wù)管理。它很好的平衡了對(duì)提供者要求低先進(jìn)功能如事務(wù)參與和兼容環(huán)境。 深入淺出 JMS(七) - ActiveMQ 與 Spring 整合 一、與spring整合實(shí)現(xiàn)ptp的同步接收消息 (1)config.properties ## ActiveMQ Conf...
閱讀 1364·2021-11-16 11:44
閱讀 3839·2021-10-09 10:01
閱讀 1829·2021-09-24 10:31
閱讀 4059·2021-09-04 16:41
閱讀 2581·2021-08-09 13:45
閱讀 1301·2019-08-30 14:08
閱讀 1864·2019-08-29 18:32
閱讀 1701·2019-08-26 12:12