JMS(javaMessage Service)學習一

來源:互聯網
上載者:User

標籤:rod   選擇性   模組   font   ica   問題   產品   cto   第一個   

一、JMS是個什麼鬼

1、百度百科解釋:JMS即JavaMessage Service(Java Message Service)應用程式介面,是一個Java平台中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分布式系統中發送訊息,進行非同步通訊。JavaMessage Service是一個與具體平台無關的API,絕大多數MOM供應商都對JMS提供支援。

2、JMS是一組Message Service的api即介面規範即資料庫的JDBCMessage Service的JMS。

二、為什麼要學習,使用JMS

1、在JAVA中,如果兩個應用程式之間對各自都不瞭解,甚至這兩個程式可能部署在不同的大洲上,那麼它們之間如何發送訊息呢?舉個例子,一個應用程式A部署在印度,另一個應用程式部署在美國,然後每當A觸發某件事後,B想從A擷取一些更新資訊。當然,也有可能不止一個B對A的更新資訊感興趣,可能會有N個類似B的應用程式想從A中擷取更新的資訊。在這種情況下,JAVA提供了最佳的解決方案-JMS,完美解決了上面討論的問題。JMS同樣適用於基於事件的應用程式,如聊天服務,它需要一種發布事件機制向所有與伺服器串連的用戶端發送訊息。JMS與RMI不同,發送訊息的時候,接收者不需要線上。伺服器發送了訊息,然後就不管了;等到用戶端上線的時候,能保證接收到伺服器發送的訊息。這是一個很強大的解決方案,能處理當今世界很多普遍問題。

三、JMS有什麼優勢

1、非同步:JMS天生就是非同步,用戶端擷取訊息的時候,不需要主動發送請求,訊息會自動發送給可用的用戶端。

2、可靠:JMS保證訊息只會遞送一次。大家都遇到過重複建立訊息問題,而JMS能幫你避免該問題,只是避免而不是杜絕,所以在一些糟糕的環境下還是有可能會出現重複。

四、JMS訊息傳送模型

在JMS API出現之前,大部分產品使用“點對點”和“發布/訂閱”中的任一方式來進行訊息通訊。JMS定義了這兩種訊息發送模型的規範,它們相互獨立。任何JMS的提供者可以實現其中的一種或兩種模型,這是它們自己的選擇。JMS規範提供了通用介面保證我們基於JMS API編寫的程式適用於任何一種模型。讓我們更加詳細的看下這兩種訊息傳送模型;

1、點對點訊息傳送模型(P2P)

在點對點訊息傳送模型中,應用程式由訊息佇列,寄件者,接收者組成。每一個訊息發送給一個特殊的訊息佇列,該隊列儲存了所有發送給它的訊息(除了被接收者消費掉的和到期的訊息)。

點對點訊息模型有如下特性:

(1)、每個訊息只有一個接受者(自己測試了一下,可以有多個接受者,但是當有多個接收者時,每個接收者只能擷取隨機的幾條資訊)

(2)、訊息寄件者和訊息接受者並沒有時間依賴性。

(3)、當訊息寄件者發送訊息的時候,無論接收者程式在不在運行,都能擷取到訊息;

(4)、當接收者收到訊息的時候,會發送確認收到通知(acknowledgement)。

(5)、點對點訊息模型圖:


2、發布/訂閱訊息傳送模型

在發布/訂閱訊息模型中,發行者發布一個訊息,該訊息通過topic傳遞給所有的用戶端。在這種模型中,發行者和訂閱者彼此不知道對方,是匿名的且可以動態發布和訂閱topic。topic主要用於儲存和傳遞訊息,且會一直儲存訊息直到訊息被傳遞給用戶端。

發布/訂閱訊息模型有如下特性:

(1)、一個訊息可以傳遞給多個訂閱者

(2)、發行者和訂閱者有時間依賴性,只有當用戶端建立訂閱後才能接受訊息,且訂閱者需一直保持活動狀態以接收訊息。

(3)、為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被啟用(運行),它也能接收到發行者的訊息。

(4)、發布/訂閱訊息模型圖:




五、接收訊息

在JMS中,訊息的接收可以使用以下兩種方式:

1、同步方式:使用同步方式接收訊息的話,訊息訂閱者調用receive()方法。在receive()中,訊息未到達或在到達指定時間之前,方法會阻塞,直到訊息可用。

(1)、 目的地是Queue

consumer = session.createConsumer(queue);Message message = consumer.receive(); //同步方式接收
(2)、目的地是Destination

consumer = session.createConsumer(destination);//同步方式接受資訊,如果還沒有擷取到則會阻塞直到接收到資訊Message messages = consumer.receive();

2、非同步方式:使用非同步方式接收訊息的話,訊息訂閱者需註冊一個訊息監聽者,類似於事件監聽器,只要訊息到達,JMS服務提供者會通過調用監聽器的onMessage()遞送訊息。

非同步方式接收是使用了監聽方式:

consumer.setMessageListener(new MessageListener(){@Overridepublic void onMessage(Message message) {TextMessage textMessage = (TextMessage)message;try {String value = textMessage.getText();System.out.println("value: "+value);} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});

六、JMS編程介面

JMS應用程式由如下基本模組組成:

1、管理對象(Administered objects)-串連工廠(Connection Factories)和目的地(Destination)
2、連線物件(Connections)
3、會話(Sessions)
4、訊息生產者(Message Producers)
5、訊息消費者(Message Consumers)
6、訊息監聽者(Message Listeners)


7、JMS管理對象

管理對象(Administered objects)是預先配置的JMS對象,由系統管理員為使用JMS的用戶端建立,主要有兩個被管理的對象:
串連工廠(ConnectionFactory)
目的地(Destination)
這兩個管理對象由JMS系統管理員通過使用Application Server管理主控台建立,儲存在應用程式伺服器的JNDI名字空間或JNDI註冊表。

8、串連工廠(ConnectionFactory)

用戶端使用一個串連工廠對象串連到JMS服務提供者,它建立了JMS服務提供者和用戶端之間的串連。JMS用戶端(如寄件者或接受者)會在JNDI名字空間中搜尋並擷取該串連。使用該串連,用戶端能夠與目的地通訊,往隊列或話題發送/接收訊息。讓我們用一個例子來理解如何發送訊息:

9、目的地(Destination)

目的地指明訊息被發送的目的地以及用戶端接收訊息的來源。JMS使用兩種目的地,隊列和話題。

10、JMS串連

連線物件封裝了與JMS提供者之間的虛擬串連,如果我們有一個ConnectionFactory對象,可以使用它來建立一個串連。

//連結工廠ActiveMQConnectionFactory connectionFactory = null;//連結化物件Connection connection = null;connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://192.168.1.111:61616");connection = connectionFactory.createConnection();connection.start();

11、JMS 會話(Session)

Session是一個單線程上下文,用於生產和消費訊息,可以建立出訊息生產者和訊息消費者。
Session對象實現了Session介面,在建立完串連後,我們可以使用它建立Session。

//第一個參數是否開啟事務 true開啟 ,false不開啟事務,如果開啟記得手動提交//參數二,表示的是簽收模式,一般使用的有自動簽收和用戶端自己確認簽收session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
12、JMS訊息生產者

訊息生產者由Session建立,用於往目的地發送訊息。生產者實現MessageProducer介面,我們可以為目的地、隊列或話題建立生產者;

(1)、隊列(Queue)

Queue  queue  = session.createQueue("test_queue");//為隊列建立訊息生產者MessageProducer producer =  session.createProducer(queue);

(2)、目的地(Destination)

Destination destination = session.createQueue("test-queue");//為目的地建立訊息生產者MessageProducer producer = session.createProducer(destination);
(1)(2)這兩種方式只能用在點對點訊息模型

(3)、話題(Topic)

  //建立話題        Topic topic = session.createTopic("myTopic.messages");          //為話題建立訊息生產者        MessageProducer producer = session.createProducer(topic);  
(3)、只能用在發布/訂閱訊息模型上。


   建立完訊息生產者後,可以使用send方法發送訊息:

//建立訊息TextMessage message = session.createTextMessage();message.setText("測試隊列訊息"+i);//發送訊息到目的地producer.send(message);

13、JMS訊息消費者

訊息消費者由Session建立,用於接收目的地發送的訊息。消費者實現MessageConsumer介面,我們可以為目的地、隊列或話題建立消費者;

(1)、隊列(Queue)

Queue queue = session.createQueue("test_queue"); //隊列(目的地,消費者消費訊息的地方)MessageConsumer consumer = session.createConsumer(queue); //訊息消費者
(2)、目的地(Destination)

//訊息目的地Destination destination = session.createQueue("test-queue");//訊息消費者MessageConsumer consumer = session.createConsumer(destination);
(3)、話題(Topic)

 //建立話題        Topic topic = session.createTopic("myTopic.messages");         //為話題建立消費者        MessageConsumer consumer = session.createConsumer(topic); 
14、JMS訊息監聽器(訊息監聽這種方式也就是訊息的非同步接收方式)
JMS訊息監聽器是訊息的預設事件處理者,他實現了MessageListener介面,該介面包含一個onMessage方法,在該方法中需要定義訊息達到後的具體動作。通過調用setMessageListener方法我們給指定消費者定義了訊息監聽器.

(1)、TextMessage

consumer.setMessageListener(new MessageListener(){@Overridepublic void onMessage(Message message) {TextMessage textMessage = (TextMessage)message;try {String value = textMessage.getText();System.out.println("value: "+value);} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});

(2)、ObjectMessage

consumer.setMessageListener(new MessageListener(){@Overridepublic void onMessage(Message message){try {TestBean  tbean =(TestBean)((ObjectMessage)message).getObject();System.out.println("tbean: "+tbean);if(null != message) { System.out.println("收到資訊1: "+tbean.getName());}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});

七、JMS訊息結構

JMS用戶端使用JMS訊息與系統通訊,JMS訊息雖然格式簡單但是非常靈活, JMS訊息由三部分組成:

1、訊息頭

JMS訊息頭預定義了若干欄位用於用戶端與JMS提供者之間識別和發送訊息,先行編譯頭如下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority

2、訊息屬性

我們可以給訊息設定自訂屬性,這些屬性主要是提供給應用程式的。對於實現訊息過濾功能,訊息屬性非常有用,JMS API定義了一些標準屬性,JMS服務提供者可以選擇性的提供部分標準屬性。

3、訊息體

在訊息體中,JMS API定義了五種類型的訊息格式,讓我們可以以不同的形式發送和接受訊息,並提供了對已有訊息格式的相容。不同的訊息類型如下:
Text message : javax.jms.TextMessage,表示一個文字物件。
Object message : javax.jms.ObjectMessage,表示一個JAVA對象。
Bytes message : javax.jms.BytesMessage,表示位元組資料。
Stream message :javax.jms.StreamMessage,表示java原始值資料流。
Map message : javax.jms.MapMessage,表示鍵值對。

參考文章:http://www.cnblogs.com/chenpi/p/5559349.html#_label6

http://howtodoinjava.com/jms/jms-java-message-service-tutorial/

JMS(javaMessage Service)學習一

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.