<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot整合ActiveMQ入門實(shí)踐

          共 1942字,需瀏覽 4分鐘

           ·

          2020-09-23 18:28

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達(dá)

          66套java從入門到精通實(shí)戰(zhàn)課程分享

          目標(biāo)

          • 編寫并運(yùn)行一個Demo直觀看出ActiveMQ的效果

          步驟

          下載ActiveMQ

          • 下載地址:http://activemq.apache.org/components/classic/download/
            Linux下載后解壓,進(jìn)入bin目錄后,執(zhí)行“./activemq start”即可

          • 網(wǎng)站管理端口:8161
            broker端口:61616

          構(gòu)建SpringBoot項(xiàng)目

          • 必要依賴:
            spring-boot-starter-web
            spring-boot-starter-activemq

          • yml配置:

            • broker地址:spring.activemq.broker-url
              注意用tcp協(xié)議而非http協(xié)議

            • 賬號:spring.activemq.user
              默認(rèn)為admin

            • 密碼:spring.activemq.password
              默認(rèn)為admin

          實(shí)現(xiàn)Queue和Topic的生產(chǎn)和消費(fèi)

          • ActiveMQ下有隊(duì)列Queue和主題Topic之分
            1 Queue是生產(chǎn)者/消費(fèi)者的模式
            消息不會被重復(fù)消費(fèi),當(dāng)發(fā)出消息時沒有消費(fèi)者時,消息也會保存在broker中,等到出現(xiàn)消費(fèi)者時供其消費(fèi)。
            2 Topic是發(fā)布/訂閱的模式
            消息一旦發(fā)出會被當(dāng)時存在的所有訂閱者消費(fèi),當(dāng)發(fā)出消息時沒有消費(fèi)者,消息不會保存。

          • 生產(chǎn)者
            1 對于Destination,Queue和Topic使用的類是有區(qū)別的。
            2 框架會根據(jù)yml中的服務(wù)器信息自動注入生成jmsMessagingTemplate。

          @Service
          public?class?Producer?{

          ????@Autowired
          ????private?JmsMessagingTemplate?jmsMessagingTemplate;

          ????//Queue消息不能被重復(fù)消費(fèi)?即使沒有消費(fèi)者?消息也會被保存
          ????public?void?sendQueueMessage(String?queueName,?String?message){
          ????????System.out.println("==========>>>>>?Queue發(fā)送消息:?"?+?message);
          ????????Destination?destination?=?new?ActiveMQQueue(queueName);
          ????????jmsMessagingTemplate.convertAndSend(destination,?message);
          ????}

          ????//Topic消息會被所有訂閱者消費(fèi)?沒有訂閱者時?消息不會保存
          ????public?void?sengTopicMessage(String?topicName,?String?message){
          ????????System.out.println("==========>>>>>?Topic發(fā)送消息:?"?+?message);
          ????????Destination?destination?=?new?ActiveMQTopic(topicName);
          ????????jmsMessagingTemplate.convertAndSend(destination,?message);
          ????}
          }


          • 消費(fèi)者
            1 為了讓效果明顯一些,我各創(chuàng)建了2個Queue消費(fèi)者和2個Topic消費(fèi)者。
            2 消費(fèi)者方法名上要加注解@JmsListener,并配置好destination即可實(shí)現(xiàn)消費(fèi)者的功能。
            3 ActiveMQ默認(rèn)pub-sub-domain=false,即不支持Topic,只支持Queue。
            4 為了兼容支持Topic,需要對JmsListenerContainerFactory進(jìn)行自定義配置。
            5 Topic消費(fèi)方法的@JmsListener中的參數(shù)containerFactor即為需要自定義配置的項(xiàng),其值jmsTopicListenerContainer是自定義的方法名字,這個名字隨便起,具體配置在下方。

          @Service
          public?class?Customer?{

          ????@JmsListener(destination?=?"test.queue")
          ????public?void?receiveQueueMessage1(String?message){
          ????????System.out.println("<<<<<==========?Mary消費(fèi):?"?+?message);
          ????}

          ????@JmsListener(destination?=?"test.queue")
          ????public?void?receiveQueueMessage2(String?message){
          ????????System.out.println("<<<<<==========?Jmy消費(fèi):?"?+?message);
          ????}

          ????//要配置containerFactory?值為@Bean的方法名
          ????//否則會走默認(rèn)的配置?默認(rèn)的只支持Queue?不支持Topic
          ????@JmsListener(destination?=?"test.topic",?containerFactory?=?"jmsTopicListenerContainer")
          ????public?void?receiveTopicMessage1(String?message){
          ????????System.out.println("<<<<<==========?Peggy消費(fèi):?"?+?message);
          ????}

          ????@JmsListener(destination?=?"test.topic",?containerFactory?=?"jmsTopicListenerContainer")
          ????public?void?receiveTopicMessage2(String?message){
          ????????System.out.println("<<<<<==========?Hermione消費(fèi):?"?+?message);
          ????}
          }


          • ActiveMQ對于支持Topic的配置
            1 主要是為了讓pub-sub-domain為true。
            2 方法參數(shù)ActiveMQConnectionFactory也是框架自動幫忙注入的,而且不用通過@Autowired這樣的方式,就寫成下邊代碼所示的那樣就行。
            3 如果僅僅是下邊的代碼,啟動時還是會報錯,要額外在yml中配置spring.jms.cache.enabled=false。

          @Configuration
          public?class?ActiveMQConfig?{

          ????//主要是配置PubSubDomain為true
          ????//參數(shù)connectionFactory的值是根據(jù)yml中的配置自動注入的
          ????//一定要在yml中配置spring.jms.cache.enabled?=?false
          ????@Bean
          ????public?JmsListenerContainerFactory?jmsTopicListenerContainer(ActiveMQConnectionFactory?connectionFactory){
          ????????DefaultJmsListenerContainerFactory?factory?=?new?DefaultJmsListenerContainerFactory();
          ????????factory.setPubSubDomain(true);
          ????????factory.setConnectionFactory(connectionFactory);
          ????????return?factory;
          ????}
          }


          效果

          • 測試代碼

          @SpringBootTest
          @RunWith(SpringRunner.class)
          public?class?ActiveMQTest?{

          ????@Autowired
          ????private?Producer?producer;

          ????@Test
          ????public?void?TestProcess(){
          ????????for(int?i?=?1;?i?<=?10;?i++){
          ????????????producer.sendQueueMessage("test.queue",?"Queue?Message:?Q"?+?i);
          ????????????producer.sengTopicMessage("test.topic",?"Topic?Message:?T"?+?i);
          ????????}
          ????}

          }


          • 效果

          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q1
          <<<<<==========?Jmy消費(fèi):?Queue?Message:?Q1
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T1
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T1
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T1
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q2
          <<<<<==========?Mary消費(fèi):?Queue?Message:?Q2
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T2
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T2
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T2
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q3
          <<<<<==========?Jmy消費(fèi):?Queue?Message:?Q3
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T3
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T3
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T3
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q4
          <<<<<==========?Mary消費(fèi):?Queue?Message:?Q4
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T4
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T4
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T4
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q5
          <<<<<==========?Jmy消費(fèi):?Queue?Message:?Q5
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T5
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T5
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T5
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q6
          <<<<<==========?Mary消費(fèi):?Queue?Message:?Q6
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T6
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T6
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T6
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q7
          <<<<<==========?Jmy消費(fèi):?Queue?Message:?Q7
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T7
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T7
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T7
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q8
          <<<<<==========?Mary消費(fèi):?Queue?Message:?Q8
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T8
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T8
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T8
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q9
          <<<<<==========?Jmy消費(fèi):?Queue?Message:?Q9
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T9
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T9
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T9
          ==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q10
          <<<<<==========?Mary消費(fèi):?Queue?Message:?Q10
          ==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T10
          <<<<<==========?Hermione消費(fèi):?Topic?Message:?T10
          <<<<<==========?Peggy消費(fèi):?Topic?Message:?T10


          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          http://blog.csdn.net/m0_37676106/article/details/108683244




          粉絲福利:108本java從入門到大神精選電子書領(lǐng)取

          ???

          ?長按上方鋒哥微信二維碼?2 秒
          備注「1234」即可獲取資料以及
          可以進(jìn)入java1234官方微信群



          感謝點(diǎn)贊支持下哈?

          瀏覽 87
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.日韩在线 | 超碰人人草人人 | 成人亚洲AV日韩AV无码 | 国产AV中文 | 一本大道中文字幕无码29 |