久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JMS異步消息機(jī)制

 jimmylin88cn 2007-10-14
JMS異步消息機(jī)制
2007-08-07 16:17
在分布式企業(yè)級(jí)應(yīng)用程序中,異步消息機(jī)制用于有效地協(xié)調(diào)各個(gè)部分的工作,。
  J2EE為我們提供了JMS和消息驅(qū)動(dòng)Bean(Message-Driven Bean),,用來實(shí)現(xiàn)應(yīng)用程序各個(gè)部件之間的異步消息傳遞。
  一.什么是消息系統(tǒng),?
  通常一個(gè)消息系統(tǒng)允許分開的未耦合的應(yīng)用程序之間可靠地異步通信,。在企業(yè)應(yīng)用時(shí),需要一種異步的,,非阻塞的消息傳遞,。比如,一個(gè)客戶端可能希望給一個(gè)服務(wù)器發(fā)送一個(gè)請(qǐng)求后,,不在乎是否馬上能得到回應(yīng),。這樣,客戶端沒有理由必須等待服務(wù)器處理請(qǐng)求,??蛻舳藨?yīng)用程序在遞交一個(gè)請(qǐng)求之后,只需確保請(qǐng)求到達(dá)服務(wù)器端后,,就可以處理其他任務(wù),。通常,,這是很高效的。消息系統(tǒng)提供了許多其他分布式對(duì)象計(jì)算模型沒有的優(yōu)點(diǎn),。它鼓勵(lì)在消息產(chǎn)生者和使用者之間的"松耦合",,在它們之間有很高程度的事務(wù)處理。對(duì)于使用者,,它不在乎誰產(chǎn)生了消息,,產(chǎn)生者是否仍在網(wǎng)絡(luò)上以及消息是什么時(shí)候產(chǎn)生的。這就允許建立動(dòng)態(tài)的,,可靠的和靈活的系統(tǒng),。整個(gè)的子系統(tǒng)能被修改而不會(huì)影響系統(tǒng)的其他部分。
  另外的優(yōu)點(diǎn)包括:系統(tǒng)的高度可擴(kuò)展性,,容易與其他系統(tǒng)進(jìn)行集成,,以及高度的可靠性。由于可靠性和可擴(kuò)展性,,使得它們用于解決許多商業(yè)和科學(xué)計(jì)算問題,。比如,消息系統(tǒng)是許多應(yīng)用程序的基礎(chǔ),,這些應(yīng)用程序可以是工作流,,網(wǎng)絡(luò)管理,通信服務(wù)或供應(yīng)鏈管理程序,。在JAVA技術(shù)中,處理異步消息的能力是通過JMS來實(shí)現(xiàn)的,。JMS最初設(shè)計(jì)是為了給傳統(tǒng)的消息對(duì)象中間件提供一個(gè)標(biāo)準(zhǔn)的JAVA接口,。而這些產(chǎn)品是在一個(gè)企業(yè)級(jí)應(yīng)用程序中必須的。現(xiàn)在出現(xiàn)了許多支持JMS的純JAVA的產(chǎn)品,。
feedom.net關(guān)注網(wǎng)管是我們的使命

  消息系統(tǒng)類型
  通常有兩種消息類型,。
  1.發(fā)布/訂閱(publish/subscribe)
  發(fā)布/訂閱消息系統(tǒng)支持一個(gè)事件驅(qū)動(dòng)模型,消息產(chǎn)生者和使用者都參與消息的傳遞,。產(chǎn)生者發(fā)布事件,,而使用者訂閱感興趣的事件,并使用事件,。產(chǎn)生者將消息和一個(gè)特定的主題(Topic)連在一起,,消息系統(tǒng)根據(jù)使用者注冊(cè)的興趣,將消息傳給使用者,。
  2.點(diǎn)對(duì)點(diǎn)(Peer to peer)
  在點(diǎn)對(duì)點(diǎn)的消息系統(tǒng)中,,消息分發(fā)給一個(gè)單獨(dú)的使用者。它維持一個(gè)"進(jìn)入"消息隊(duì)列,。消息應(yīng)用程序發(fā)送消息到一個(gè)特定的隊(duì)列,,而客戶端從一個(gè)隊(duì)列中得到消息,。
  二.JMS簡(jiǎn)介
  JMS的目的是提供給消息系統(tǒng)客戶一個(gè)固定的接口,而且與底層的消息提供者無關(guān),。這樣,,客戶端的應(yīng)用程序可以在不同的機(jī)器和操作系統(tǒng)中移植,而且能在不同的消息系統(tǒng)產(chǎn)品之間轉(zhuǎn)移,。JMS客戶端都是建立在JAVA技術(shù)上的,,從而也能使用其他JAVA API,如JDBC數(shù)據(jù)庫連接,,使用JAVA BEAN組件模型,,JDNI名字服務(wù),JTA客戶端事務(wù)處理控制以及J2SE和J2EE API來實(shí)現(xiàn)企業(yè)級(jí)應(yīng)用服務(wù)程序,。
  1.JMS對(duì)象模型
   
  圖1顯示了JMS對(duì)象,,用于提供JMS客戶端與JMS服務(wù)提供者相連的對(duì)象。 feedom.net國內(nèi)最早的網(wǎng)管網(wǎng)站
  ConnectionFactory是一個(gè)客戶端用來創(chuàng)建一個(gè)Connection的管理對(duì)象,。由于在Connection創(chuàng)建時(shí)有授權(quán)和通信建立過程,,因此這個(gè)對(duì)象是比較大的。
  Destination對(duì)象將一個(gè)消息的目的和服務(wù)提供者有關(guān)的地址及配置信息包裝起來,。
  Session是JMS實(shí)體,,用來支持事務(wù)處理和異步消息消費(fèi)。JMS并不需要客戶端的代碼用于異步消息消費(fèi)或能處理多個(gè)并發(fā)消息,。通常,,事務(wù)的復(fù)雜性都由一個(gè)Session來封裝。
  一個(gè)Session是一個(gè)原子單位的工作,,與數(shù)據(jù)庫的事務(wù)一樣,,要實(shí)現(xiàn)多線程事務(wù)比較困難。Session提供了在一個(gè)線程編程模式下的并發(fā)的優(yōu)點(diǎn),。
  MessageProducer和MessageConsumer對(duì)象由Session對(duì)象創(chuàng)建,。用于發(fā)送和接受消息。為了確保消息的傳遞,,JMS服務(wù)提供者處理的消息都要處于PERSISTENT模式,。PERSISTENT模式使得JMS提供者出問題后,也能讓消息保存下來,。
  Session,,MessageProducer和MessageConsumer都不支持并發(fā),而ConnectionFactory,,Destination和Connection都支持并發(fā),。
  2.JMS應(yīng)用程序開發(fā)
  JMS中的消息
  在消息系統(tǒng)中,應(yīng)用程序之間通信的關(guān)鍵是消息。因此使用JMS必須要先理解消息,。
  在JMS中,,消息由三部分組成:
  MESSAGE HEADER用于識(shí)別消息,比如用于判斷一個(gè)給定的消息是否是一個(gè)"訂閱者"
bbs.bitsCN.com國內(nèi)最早的網(wǎng)管論壇

  PROPERITIES用于與應(yīng)用程序相關(guān)的,,提供者相關(guān)的和可選項(xiàng)的信息
  BODY是消息的內(nèi)容,,支持幾種格式,包括TextMessage(對(duì)String一個(gè)簡(jiǎn)單的封裝)和ObjectMessage(對(duì)任意對(duì)象的封裝,,但必須支持序列化),,也支持其他格式。
  TextMessage
  一個(gè)TextMessage是一個(gè)String對(duì)象的封裝,。在只有文本對(duì)象傳遞時(shí),,是很有用的。它假設(shè)許多消息系統(tǒng)是建立在XML上的,。從而TextMessage就可以成為包裝它們的容器,。
  創(chuàng)建一個(gè)TextMessage對(duì)象很簡(jiǎn)單,如下面的代碼:
  TextMessage message=session.createMessage();
  message.setText("Hello, world!");
  ObjectMessage
  如名字所示,,它是對(duì)一個(gè)JAVA對(duì)象的封裝的消息,。任何可序列化的JAVA對(duì)象都能用于ObjectMessage,如果必須將多個(gè)對(duì)象封裝在一個(gè)消息里傳遞,,可以使用Collection對(duì)象,,來包括多個(gè)序列化對(duì)象。
  下面是創(chuàng)建一個(gè)ObjectMessage
  ObjectMessage message=session.createObjectMessage();
  message.setObject(myObject);
  創(chuàng)建一個(gè)JMS客戶端程序
  一個(gè)典型的JMS客戶端由下面的幾個(gè)基本步驟來創(chuàng)建:
  創(chuàng)建一個(gè)到消息系統(tǒng)提供者的連接(Connection) bitsCN.com中國網(wǎng)管聯(lián)盟
  創(chuàng)建一個(gè)Session,,用于接收和發(fā)送消息
  創(chuàng)建MessageProducer和MessageConsumer來創(chuàng)建和接收消息
  當(dāng)完成了上述步驟后,,一個(gè)消息產(chǎn)生者客戶端將創(chuàng)建并發(fā)布消息到一個(gè)主題,而消息使用者客戶端會(huì)接收與一個(gè)主題相關(guān)的消息,。
  1.創(chuàng)建一個(gè)Connection
  一個(gè)Connection提供客戶端對(duì)底層的消息系統(tǒng)的訪問,。并實(shí)現(xiàn)資源的分配和管理。通過使用一個(gè)ConnectionFactory來創(chuàng)建一個(gè)Connection,,通常用JDNI來指定:
   
  2.創(chuàng)建一個(gè)Session
  Session是一個(gè)比較大的JMS對(duì)象,他提供了生產(chǎn)和消費(fèi)消息的手段,。用于創(chuàng)建消息使用者和消息產(chǎn)生者,。
  topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
  兩個(gè)參數(shù)用于控制事務(wù)和消息確認(rèn)。
  3.定位一個(gè)Topic
  用JDNI來定位一個(gè)Topic,,Topic用于識(shí)別發(fā)送或接收的消息,,在發(fā)布/訂閱系統(tǒng)中。訂閱者訂閱一個(gè)給定的Topic,,而發(fā)布者將它發(fā)布的消息與一個(gè)Topic相連,。
  下面是創(chuàng)建一個(gè)Topic "WeatherReport"
  Topic weatherTopic=messaging.lookup("WeatherReport");
  4.啟動(dòng)Connection
bitsCN全力打造網(wǎng)管學(xué)習(xí)平臺(tái)

  在上面的初始化步驟之后,消息流是禁止的,用于防止在初始化時(shí)發(fā)生不可預(yù)料的行為,。一旦初始化結(jié)束,,必須讓Connection啟動(dòng)消息系統(tǒng)。
  topicConnection.start();
  5.創(chuàng)建一個(gè)消息產(chǎn)生者
  在發(fā)布/訂閱里,,一個(gè)產(chǎn)生者發(fā)布消息到一個(gè)指定的Topic,。下面的代碼顯示創(chuàng)建一個(gè)產(chǎn)生者,以及后續(xù)的建立和發(fā)布一個(gè)簡(jiǎn)單文本消息,。
  TopicPublisher publisher=session.createPublisher(weatherTopic);
  TexeMessage message=session.createMessage();
  message.setText("ssss");
  publisher.publish(message);
  下面是一個(gè)消息使用者的代碼
  
  三.消息驅(qū)動(dòng)Bean簡(jiǎn)介
  異步消息也可以由消息驅(qū)動(dòng)Bean來實(shí)現(xiàn),。在EJB 1.1規(guī)范中,定義了兩種類型的EJB,。分別是實(shí)體Bean(Entity Bean)和會(huì)話Bean(Session Bean),。客戶端通常是以同步的,,阻塞方式來調(diào)用Bean的方法,。消息驅(qū)動(dòng)Bean將EJB和JMS的功能結(jié)合在一起。
  正如前述,,會(huì)話Bean通常實(shí)現(xiàn)商務(wù)邏輯,,客戶端不能共享一個(gè)會(huì)話Bean。實(shí)體Bean通常和一些在永久存儲(chǔ)中的一些實(shí)體條目相對(duì)應(yīng)的,。這兩種Bean通常都有REMOTE和HOME接口,,用來與客戶端交互。并且,,這些交互都是同步的,,阻塞方式進(jìn)行的。比如,,一個(gè)請(qǐng)求發(fā)送給一個(gè)Bean,,通過阻塞式方法調(diào)用,服務(wù)器返回一個(gè)相應(yīng),。調(diào)用者在收到返回后,,才能進(jìn)行下一步處理。消息驅(qū)動(dòng)Bean通常配置成是一個(gè)特別的主題(topic)或隊(duì)列的客戶端,,作為消息的使用者,。但消息驅(qū)動(dòng)Bean沒有HOME和REMOTE接口。一個(gè)消息產(chǎn)生者將消息寫入TOPIC或隊(duì)列時(shí),,并不知道使用者是一個(gè)消息驅(qū)動(dòng)Bean,。這就允許集成一個(gè)分布式的計(jì)算系統(tǒng)時(shí),有很大的靈活性,。消息驅(qū)動(dòng)Bean沒有會(huì)話性質(zhì)的狀態(tài),,所有的實(shí)例在不處理請(qǐng)求時(shí)是相同的,這與無狀態(tài)會(huì)話Bean是類似的。將Bean的實(shí)例放在緩沖池里,,也是高效處理消息驅(qū)動(dòng)Bean的一種方法,。一個(gè)消息驅(qū)動(dòng)Bean必須間接或直接地從javax.ejb.MessageDrivenBean接口繼承而來。這個(gè)接口是由javax.jms.MessageListener繼承而來,。這個(gè)方法的一個(gè)參數(shù)是javax.jms.Message,。可以是任何有效的JMS消息類型,。方法的申明中并不包含一個(gè)thrown語句,。因此在消息處理中,不會(huì)仍出應(yīng)用程序異常,。當(dāng)容器接收到消息時(shí),,它首先是從一個(gè)緩沖池里得到現(xiàn)成的一個(gè)消息驅(qū)動(dòng)Bean,然后,,如果配置文件需要的,,容器還要設(shè)置一個(gè)和事務(wù)處理上下文的一個(gè)聯(lián)系。當(dāng)這些管理任務(wù)完成時(shí),,接收到的消息傳遞給onMessage()方法,。一旦方法完成,事務(wù)確認(rèn)或返回,,Bean又被重新放回到緩沖池,。 bbs.bitsCN.com國內(nèi)最早的網(wǎng)管論壇
  ejbRemove()在把消息驅(qū)動(dòng)Bean從任何存儲(chǔ)上刪除時(shí)調(diào)用。并進(jìn)行清楚操作和垃圾收集,。必須在ejbRemove()方法中釋放所有Bean的實(shí)例用到的資源,。
  setMessageDri

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多