在分散式企業級應用程式中,非同步訊息機制用於有效協調各部分工作。J2EE 提供 JMS 與訊息驅動 Bean (Message-Driven Bean),實作應用程式各元件間非同步訊息傳遞。
訊息系統允許分離、未耦合的應用程式間可靠地非同步通訊。企業應用需要非同步、非阻塞訊息傳遞。例如客戶端發送請求給伺服器後,不在乎是否馬上得到回應,無需等待伺服器處理,提交請求確保到達伺服器端後即可處理其他任務,極具效率。
訊息系統提供許多分散式物件運算模型沒有的優點:鼓勵生產者與消費者間「鬆耦合」,擁有高度交易處理能力。對消費者而言,不在乎誰產生訊息、生產者是否仍在網路上、訊息何時產生,允許建立動態、可靠、彈性的系統,整個子系統可修改而不影響其他部分。其他優點包括:高度可擴展性、易與其他系統整合、高度可靠性。因可靠性與可擴展性,廣泛用於工作流、網路管理、通訊服務、供應鏈管理等。Java 技術中透過 JMS 實作非同步訊息處理能力。JMS 最初設計為給傳統訊息導向中介軟體提供標準 Java 介面,現已有許多支援 JMS 的純 Java 產品。
JMS 目標:提供訊息系統客戶固定介面,與底層訊息提供者無關。客戶端應用程式可在不同機器、作業系統移植,並在不同訊息系統產品間轉移。JMS 客戶端建立於 Java 技術上,可使用 JDBC、JavaBeans、JNDI、JTA、J2SE/J2EE API 實作企業級應用服務程式。

圖 1 顯示 JMS 物件,用於提供 JMS 客戶端與服務提供者連線的物件。
訊息由三部分組成:
TextMessage(String 簡單封裝)、ObjectMessage(任意物件封裝,需支援序列化)等。String 物件封裝,僅傳遞文字物件時很有用。假設許多訊息系統建立在 XML 上,TextMessage 可成為包裝容器。建立範例:
TextMessage message = session.createTextMessage();
message.setText("Hello, world!");
Java 物件封裝訊息。任何可序列化 Java 物件皆可用。若需在一個訊息封裝多個物件,可用 Collection 包含多個序列化物件。建立範例:
ObjectMessage message = session.createObjectMessage();
message.setObject(myObject);
典型 JMS 客戶端基本步驟:
InitialContext jndiContext = new InitialContext();
TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) jndiContext.lookup("TopicConnectionFactory");
Topic topic = (Topic) jndiContext.lookup(topicName);
TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();
TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
兩個參數控制交易與訊息確認。
Topic weatherTopic = messaging.lookup("WeatherReport");
topicConnection.start();
初始化步驟後訊息流禁止,防止初始化時不可預期行為。初始化結束必須啟動連線。
TopicPublisher publisher = session.createPublisher(weatherTopic);
TextMessage message = session.createTextMessage();
message.setText("ssss");
publisher.publish(message);
topicConnection = topicConnectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
topicSubscriber = topicSession.createSubscriber(topic);
topicListener = new MsgListener();
topicSubscriber.setMessageListener(topicListener);
topicConnection.start();