1. 程式人生 > >(五) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 獲取 Queue 型別訊息

(五) 訊息中介軟體——使用 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