(五) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 獲取 Queue 型別訊息
文章目錄
前言
在上一篇文章中(https://blog.csdn.net/bestcxx/article/details/83211928),筆者介紹了 JmsTemplate 如何向 ActiveMQ 傳送 Queue 型別的訊息,本文將介紹如何使用 JmsTemplate 從 ActiveMQ 中讀取 Queue 型別的訊息。
為什麼不將傳送和接收寫到同一篇文章中?
筆者在學習 ActiveMQ 的過程中發現,同一型別的概念有所區分時做好分類在表述時更加方便,同時在之後的閱讀體驗也會更好,換句話說,分開寫傳送和接收是為了更好的進行所思所想進行分類闡述,散而不亂,不會讓人覺得一篇文章讀起來太過繁重。
傳送和接收的聯絡和區別-本質上是對某一個 ActiveMQQueue 的操作
經過前幾篇文章的闡述,筆者希望大家可以建立一種抽象的概念,即我們操作的本質是 ActiveMQQueue 物件,只要我們獲取到這個物件,就可以向它傳送訊息,或者讀取訊息。
所以本質上,我們通過 JmsTemplate 向ActiveMQ 傳送訊息,就是向某一個特定的 ActiveMQQueue 物件傳送訊息,由這個物件和 ActiveMQ 進行互動,進行訊息的儲存和讀取。(當然,如果我們討論的是 Topic 型別的訊息,則就是 ActiveMQTopic 物件了)
讀取 Queue 中的訊息
類的宣告
/**
* 使用 JmsTemplate 獲取 Active 中 佇列 訊息
* @author jie.wu
*/
@Component(value="jmsTemplateQueueConsumer")
public class JmsTemplateQueueConsumer {
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//用於額幾首 String (字串)型別的訊息
@Resource(name="JmsTemplateQueue")
private JmsTemplate jmsTemplate;
//用於傳送 Java 物件 型別的訊息
@Resource(name="JmsTemplateQueueForBean")
private JmsTemplate JmsTemplateQueueForBean;
}
方法一:receive
//方式一:JmsTemplate.receive
public void jmsTemplateQueueConsumerString(){
//輸出資訊,便於瞭解程式觸發時間
System.out.println(sdf.format(new Date())+":"+this.getClass().getName()+";jmsTemplateQueueConsumerString 從ActiveMQ獲取訊息:");
ObjectMessage receiveMessage=(ObjectMessage) jmsTemplate.receive();
try {
System.out.println(receiveMessage.getObject().toString());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
方法二:
//方式二:JmsTemplate.receiveAndConvert()
public void jmsTemplateQueueConsumerStringConvertAndSend(){
//輸出資訊,便於瞭解程式觸發時間
System.out.println(sdf.format(new Date())+":"+this.getClass().getName()+";jmsTemplateQueueConsumerStringConvertAndSend 從ActiveMQ獲取訊息:");
System.out.println((String) jmsTemplate.receiveAndConvert());
}
使用 receiveAndConvert 處理 Java 物件訊息
//JmsTemplate.receiveAndConvert 處理 Java 物件
public void jmsTemplateQueueConsumerForBeanReceiveAndConvert(){
//輸出資訊,便於瞭解程式觸發時間
System.out.println(sdf.format(new Date())+":"+this.getClass().getName()+";jmsTemplateQueueProductForBeanReceiveAndConvert ;從 ActiveMQ 獲取訊息");
System.out.println(JmsTemplateQueueForBean.receiveAndConvert());
}
測試方法
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.bestcxx.stu.jms.consumer.JmsTemplateQueueConsumer;
@DirtiesContext
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestJmsTemplateQueueConsumer {
@Autowired
private JmsTemplateQueueConsumer jmsTemplateQueueConsumer;
@Test
public void testJmsTemplateQueueConsumerString(){
jmsTemplateQueueConsumer.jmsTemplateQueueConsumerString();
}
@Test
public void testJmsTemplateQueueConsumerStringConvertAndSend(){
jmsTemplateQueueConsumer.jmsTemplateQueueConsumerStringConvertAndSend();
}
@Test
public void testJmsTemplateQueueConsumerForBeanReceiveAndConvert(){
jmsTemplateQueueConsumer.jmsTemplateQueueConsumerForBeanReceiveAndConvert();
}
}
驗證 Queue 訊息的三個特性
建議讀者驗證 ActiveMQ 中 Queue 型別訊息的三個特性
1、佇列之間互不干擾,即向那個佇列傳送從那個佇列獲取互不干擾
2、如果一個消費者在請求佇列時沒有訊息,則會等待,反之,如果一個訊息到達佇列而沒有消費者消費時,這個訊息會被儲存
3、一個訊息只能被一個消費者消費
參考資料
[1].《Spring 實戰 第4版》
[2].https://blog.csdn.net/winter_chen001/article/details/78409125
[3].https://blog.csdn.net/u013123635/article/details/78362360
[4].https://www.cnblogs.com/Peter2014/p/8080192.html
[5].https://blog.csdn.net/wowwilliam0/article/details/81110943
[6].https://blog.csdn.net/lsj960922/article/details/79926947
[7].https://blog.csdn.net/wangfengwf/article/details/78966704
[8].https://blog.csdn.net/hpttlook/article/details/23391967
[9].https://blog.csdn.net/super_scan/article/details/39837591