国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2EE的異步消息機制

2019-11-18 12:30:02
字體:
來源:轉載
供稿:網友

  作者:云起
  在分布式企業級應用程序中,異步消息機制用于有效地協調各個部分的工作。
  J2EE為我們提供了JMS和消息驅動Bean(Message-Driven Bean),用來實現應用程序各個部件之間的異步消息傳遞。
  一.什么是消息系統?
  通常一個消息系統答應分開的未耦合的應用程序之間可靠地異步通信。在企業應用時,需要一種異步的,非阻塞的消息傳遞。比如,一個客戶端可能希望給一個服務器發送一個請求后,不在乎是否馬上能得到回應。這樣,客戶端沒有理由必須等待服務器處理請求。客戶端應用程序在遞交一個請求之后,只需確保請求到達服務器端后,就可以處理其他任務。通常,這是很高效的。消息系統提供了許多其他分布式對象計算模型沒有的優點。它鼓勵在消息產生者和使用者之間的"松耦合",在它們之間有很高程度的事務處理。對于使用者,它不在乎誰產生了消息,產生者是否仍在網絡上以及消息是什么時候產生的。這就答應建立動態的,可靠的和靈活的系統。整個的子系統能被修改而不會影響系統的其他部分。
  另外的優點包括:系統的高度可擴展性,輕易與其他系統進行集成,以及高度的可靠性。由于可靠性和可擴展性,使得它們用于解決許多商業和科學計算問題。比如,消息系統是許多應用程序的基礎,這些應用程序可以是工作流,網絡治理,通信服務或供給鏈治理程序。在java技術中,處理異步消息的能力是通過JMS來實現的。JMS最初設計是為了給傳統的消息對象中間件提供一個標準的JAVA接口。而這些產品是在一個企業級應用程序中必須的。現在出現了許多支持JMS的純JAVA的產品。
  消息系統類型
  通常有兩種消息類型。
  1.發布/訂閱(publish/subscribe)
  發布/訂閱消息系統支持一個事件驅動模型,消息產生者和使用者都參與消息的傳遞。產生者發布事件,而使用者訂閱感愛好的事件,并使用事件。產生者將消息和一個特定的主題(Topic)連在一起,消息系統根據使用者注冊的愛好,將消息傳給使用者。
  2.點對點(Peer to peer)
  在點對點的消息系統中,消息分發給一個單獨的使用者。它維持一個"進入"消息隊列。消息應用程序發送消息到一個特定的隊列,而客戶端從一個隊列中得到消息。
  二.JMS簡介
  JMS的目的是提供給消息系統客戶一個固定的接口,而且與底層的消息提供者無關。這樣,客戶端的應用程序可以在不同的機器和操作系統中移植,而且能在不同的消息系統產品之間轉移。JMS客戶端都是建立在JAVA技術上的,從而也能使用其他JAVA API,如JDBC數據庫連接,使用JAVA BEAN組件模型,JDNI名字服務,JTA客戶端事務處理控制以及J2SE和J2EE API來實現企業級應用服務程序。
  1.JMS對象模型
   J2EE的異步消息機制(圖一)
  圖1顯示了JMS對象,用于提供JMS客戶端與JMS服務提供者相連的對象。
  ConnectionFactory是一個客戶端用來創建一個Connection的治理對象。由于在Connection創建時有授權和通信建立過程,因此這個對象是比較大的。
  Destination對象將一個消息的目的和服務提供者有關的地址及配置信息包裝起來。
  session是JMS實體,用來支持事務處理和異步消息消費。JMS并不需要客戶端的代碼用于異步消息消費或能處理多個并發消息。通常,事務的復雜性都由一個Session來封裝。
  一個Session是一個原子單位的工作,與數據庫的事務一樣,要實現多線程事務比較困難。Session提供了在一個線程編程模式下的并發的優點。
  MessagePRodUCer和MessageConsumer對象由Session對象創建。用于發送和接受消息。為了確保消息的傳遞,JMS服務提供者處理的消息都要處于PERSISTENT模式。PERSISTENT模式使得JMS提供者出問題后,也能讓消息保存下來。
  Session,MessageProducer和MessageConsumer都不支持并發,而ConnectionFactory,Destination和Connection都支持并發。
  2.JMS應用程序開發
  JMS中的消息
  在消息系統中,應用程序之間通信的要害是消息。因此使用JMS必須要先理解消息。
  在JMS中,消息由三部分組成:
  MESSAGE HEADER用于識別消息,比如用于判定一個給定的消息是否是一個"訂閱者"
  PROPERITIES用于與應用程序相關的,提供者相關的和可選項的信息
  BODY是消息的內容,支持幾種格式,包括TextMessage(對String一個簡單的封裝)和ObjectMessage(對任意對象的封裝,但必須支持序列化),也支持其他格式。
  TextMessage
  一個TextMessage是一個String對象的封裝。在只有文本對象傳遞時,是很有用的。它假設許多消息系統是建立在xml上的。從而TextMessage就可以成為包裝它們的容器。
  創建一個TextMessage對象很簡單,如下面的代碼:
  TextMessage message=session.createMessage();
  message.setText("Hello, world!");
  ObjectMessage
  如名字所示,它是對一個JAVA對象的封裝的消息。任何可序列化的JAVA對象都能用于ObjectMessage,假如必須將多個對象封裝在一個消息里傳遞,可以使用Collection對象,來包括多個序列化對象。
  下面是創建一個ObjectMessage
  ObjectMessage message=session.createObjectMessage();
  message.setObject(myObject);
  創建一個JMS客戶端程序
  一個典型的JMS客戶端由下面的幾個基本步驟來創建:
  創建一個到消息系統提供者的連接(Connection)
  創建一個Session,用于接收和發送消息
  創建MessageProducer和MessageConsumer來創建和接收消息
  當完成了上述步驟后,一個消息產生者客戶端將創建并發布消息到一個主題,而消息使用者客戶端會接收與一個主題相關的消息。
  1.創建一個Connection
  一個Connection提供客戶端對底層的消息系統的訪問。并實現資源的分配和治理。通過使用一個ConnectionFactory來創建一個Connection,通常用JDNI來指定:
   J2EE的異步消息機制(圖二)
  2.創建一個Session
  Session是一個比較大的JMS對象,他提供了生產和消費消息的手段。用于創建消息使用者和消息產生者。
  topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
  兩個參數用于控制事務和消息確認。
  3.定位一個Topic
  用JDNI來定位一個Topic,Topic用于識別發送或接收的消息,在發布/訂閱系統中。訂閱者訂閱一個給定的Topic,而發布者將它發布的消息與一個Topic相連。
  下面是創建一個Topic "WeatherReport"
  Topic weatherTopic=messaging.lookup("WeatherReport");
  4.啟動Connection
  在上面的初始化步驟之后,消息流是禁止的,用于防止在初始化時發生不可預料的行為。一旦初始化結束,必須讓Connection啟動消息系統。
  topicConnection.start();
  5.創建一個消息產生者
  在發布/訂閱里,一個產生者發布消息到一個指定的Topic。下面的代碼顯示創建一個產生者,以及后續的建立和發布一個簡單文本消息。
  TopicPublisher publisher=session.createPublisher(weatherTopic);
  TexeMessage message=session.createMessage();
  message.setText("ssss");
  publisher.publish(message);
  下面是一個消息使用者的代碼
  J2EE的異步消息機制(圖三)
  三.消息驅動Bean簡介
  異步消息也可以由消息驅動Bean來實現。在EJB 1.1規范中,定義了兩種類型的EJB。分別是實體Bean(Entity Bean)和會話Bean(Session Bean)。客戶端通常是以同步的,阻塞方式來調用Bean的方法。消息驅動Bean將EJB和JMS的功能結合在一起。
  正如前述,會話Bean通常實現商務邏輯,客戶端不能共享一個會話Bean。實體Bean通常和一些在永久存儲中的一些實體條目相對應的。這兩種Bean通常都有REMOTE和HOME接口,用來與客戶端交互。并且,這些交互都是同步的,阻塞方式進行的。比如,一個請求發送給一個Bean,通過阻塞式方法調用,服務器返回一個相應。調用者在收到返回后,才能進行下一步處理。消息驅動Bean通常配置成是一個非凡的主題(topic)或隊列的客戶端,作為消息的使用者。但消息驅動Bean沒有HOME和REMOTE接口。一個消息產生者將消息寫入TOPIC或隊列時,并不知道使用者是一個消息驅動Bean。這就答應集成一個分布式的計算系統時,有很大的靈活性。消息驅動Bean沒有會話性質的狀態,所有的實例在不處理請求時是相同的,這與無狀態會話Bean是類似的。將Bean的實例放在緩沖池里,也是高效處理消息驅動Bean的一種方法。一個消息驅動Bean必須間接或直接地從javax.ejb.MessageDrivenBean接口繼續而來。這個接口是由javax.jms.MessageListener繼續而來。這個方法的一個參數是javax.jms.Message。可以是任何有效的JMS消息類型。方法的申明中并不包含一個thrown語句。因此在消息處理中,不會仍出應用程序異常。當容器接收到消息時,它首先是從一個緩沖池里得到現成的一個消息驅動Bean,然后,假如配置文件需要的,容器還要設置一個和事務處理上下文的一個聯系。當這些治理任務完成時,接收到的消息傳遞給onMessage()方法。一旦方法完成,事務確認或返回,Bean又被重新放回到緩沖池。
  ejbRemove()在把消息驅動Bean從任何存儲上刪除時調用。并進行清楚操作和垃圾收集。必須在ejbRemove()方法中釋放所有Bean的實例用到的資源。
  setMessageDri

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇江市| 阳谷县| 澎湖县| 驻马店市| 家居| 西藏| 孟津县| 正镶白旗| 芒康县| 绥中县| 邹平县| 临泉县| 桓台县| 江门市| 新干县| 九江市| 岳阳县| 青田县| 长武县| 宝兴县| 石阡县| 交口县| 昭通市| 龙游县| 宁阳县| 噶尔县| 隆尧县| 炎陵县| 九江市| 石台县| 高邮市| 佛学| 和田市| 盈江县| 亚东县| 衢州市| 永善县| 广南县| 陇川县| 若尔盖县| 云南省|