JMS入門教程

來源:互聯網
上載者:User

轉載:http://www.cnblogs.com/jjj250/archive/2012/08/08/2628552.html


基礎篇

JMS是應用系統或組件之間相互連信的應用程式介面,利用它,我們可以輕易實現在不同JVM之間相互的遠程通訊。要實現遠程通訊,RPC同樣也能做到,但RPC卻不可避免地增加了不同系統之間的耦合度,JMS能極大地降低不同的應用系統之間的耦合。

 

要學習JMS,有幾個概念必須要搞清楚:

l      Messaging (訊息通知、訊息通訊)

一種應用系統或組件之間相互連信的方式。

 

l      Message (訊息)

訊息即為訊息通訊的載體,訊息包括Message Headers, Message properties, Message bodies

 

l      JMS有兩種方式進行訊息通訊:Point-to-Point (P2P) 和 Publish/Subscriber (PUB/SUB)

 

P2P方式是一對一的,一條訊息只有一個接收者,預設情況下是P2P訊息是持久的,也就是說寄件者(sender)產生的一條訊息(message)發送到訊息佇列(queue)之上後,只有等到訊息接收者(receiver)接收到它,才會從訊息佇列中刪除,沒有被接收的訊息會一直存在JMS容器裡。這種方式有點像郵政通訊,信件只有一個接收者,信件在接收之前,會一直存放在信箱裡。

 

PUB/SUB方式的工作流程,首先subscriber(訂閱者)向JMS容器訂閱(Listen to)自己感興趣的topic(主題),多個訂閱者可以同時對一個主題進行訂閱,訊息發行者發布一條訊息,所有訂閱了該主題的訂閱者都能收到這個訊息。預設情況下,pub/sub方式下的訊息不是持久的,這意味著,訊息一經發出,不管有沒有人接收,都不會儲存下來,而且訂閱者只能接收到自已訂閱之後發行者發出的訊息。這種方式有點像訂閱報刊雜誌,一種報刊可以有多人同時訂閱,但訂閱者只能收到開始訂閱之後的報社發行的期刊。

 

l      JMS(Java Messaging Service)

是Java EE中的一種技術,它定義一套完整的介面,來實現不同系統或應用之間的訊息通訊。這意味著:我們針對JMS介面編寫的應用程式(客戶程式),在任何一個實現了標準JMS介面的容器下都能運行起來,我們的應用程式與容器實現了真正的解藕,這也就是面向介面編程的好處之一吧。這點類似JDBC編程。

 

l      JMS提供者(JMS Provider)

JMS提供者,也叫JMS伺服器或JMS容器,也就是JMS服務的提供者,主流的J2EE容器一般都提供JMS服務(比如JBoss,BEA WebLogic,IBM WebSphere,Oracle Application Server等都支援)

 

l      串連工廠(Connection Factories)

串連工廠是用來建立用戶端到JMS容器之間JMS串連的工廠,串連工廠有兩種:(QueueConnectionFactory和TopicConnectionFactory),分別用來建立QueueConnection 和 TopicConnection的。

 

Context ctx = new InitialContext();QueueConnectionFactory queueConnectionFactory =                     (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");TopicConnectionFactory topicConnectionFactory =                     (TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");  

l      目的地(Destinations)

目的地是訊息生產者(producer)訊息發住的目的地,也是消費者(consumer)接收訊息的來源地,它有點像信箱,郵遞員把信件投往信箱,收件者從信箱取信件。對P2P方式來說,目的地就是Queue,對pub/sub方式來說,目的地就是Topic。我們要得到這個目的地的引用,只能通過JNDI尋找(lookup)的方式得到,因為目的地是註冊在JMS伺服器的(後面的章節會講到如何註冊一個目的地)

 

Topic myTopic = (Topic) ctx.lookup("MyTopic");Queue myQueue = (Queue) ctx.lookup("MyQueue");

 

l      串連(Connection)

這裡說的串連是指用戶端與JMS提供者(容器)之間的串連。串連也分兩種:QueueConnection和TopicConnection,分別對應於P2P串連和Pub/Sub串連。

 

QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();

 

串連用完之後必須記得關閉,否則串連資源不會被釋放掉。關閉串連的同時會自動把會話、產生者、消費者都關閉掉。

 

l      會話(Session)

會話是用來建立訊息產生者和訊息消費者的單線程環境,你可以它來建立訊息生產者、消費者、訊息,用它來維持訊息監聽。

 

TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);QueueSession queueSession = queueConnection.createQueueSession(true, 0);

l      訊息生產者(Message Producers)

訊息生產者也就是訊息的產生者或寄件者,在P2P方式下它是QueueSender,在Pub/Sub方式下它是TopicPublisher。它是一個由session建立的,用來把把訊息發送到目的地的對象。

QueueSender queueSender = queueSession.createSender(myQueue);TopicPublisher topicPublisher = topicSession.createPublisher(myTopic);

 

一旦你建立好生產者,你就可以用它來發送訊息

queueSender.send(message);topicPublisher.publish(message);

 

 

l      訊息消費者(Message Consumer)

訊息消費者也就是訊息的接收者或使用者,在P2P方式下這是QueueReceiver,在Pub/Sub方式下它是TopicSubscriber。這是一個由session來建立的,用來接收來自目的地訊息的對象。JMS容器來負責把訊息從目的地投遞到註冊了該目的地的訊息消費者。

 

QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);

 

一旦建立好訊息消費者,它就是活動的,你可以用它來接收訊息,你也可以用close()方法來使它失效(Inactive)。當你調用Connection的start()方法之前,消費者是不會接收到任何訊息的。兩種接收者都有一個receive方法,這是一個同步的方法,也就是說程式執行到這個方法會被阻塞,直到收到訊息為止。

queueConnection.start();Message m = queueReceiver.receive(); 
topicConnection.start();Message m = topicSubscriber.receive(1000); // time out after a second

 

如果我們不想它被阻塞,就需要非同步接收訊息,這時我們得用訊息臨聽器(Message Listener)了。

 

 

l      訊息監聽器(Message Listener)

訊息監聽器是一個充當訊息的非同步事件處理器的對象,它實現了MessageListener介面,這個介面只有一個方法onMessage,在這個方法裡,你可以定義當接收到訊息之後的要做的操作。你可以用setMessageListener方法為訊息消費者註冊一個監聽器。

 

MessageListener listener = new MessageListener( {
      public void onMessage(Message msg) {          //      }});
topicSubscriber.setMessageListener(listener); //

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.