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

首頁 > 學院 > 開發(fā)設計 > 正文

EnterpriseJavaBeansDistilled..........

2019-11-18 16:19:21
字體:
供稿:網(wǎng)友

  消息驅(qū)動Bean(續(xù))

使用哪個消息模型?

這兩種模型背后的基本原理在JMS規(guī)范中。JMS是用于訪問現(xiàn)存消息系統(tǒng),而提供公共API的方式出現(xiàn)的。在現(xiàn)如今的概念階段,一些消息廠商提供了點對點模型支持,而另一些提供對發(fā)布-訂閱模型支持。所以,JMS需要提供支持兩種模型的API才能贏得業(yè)界的廣泛支持。JMS 1.0.2規(guī)范部要求JMS供應者支持兩種模型。然而,EJB 2.0廠商需要提供對兩種消息模型的支持。

幾乎任何事情都可用pub/sub模型完成,或用點對點完成。反之亦然。以此類推,類似于開發(fā)者的編程語言選擇。理論上,能夠用Pascal寫的應用也可以用C完成。用C++能完成的任何事情,也能用java做。在某些情形下,都有一定的選擇,或者取決于對那種模型的熟悉程度罷了。

在大部分情況下,模型的選擇取決于模型各自不同的優(yōu)點。對于發(fā)布-訂閱而言,任何數(shù)目的訂閱者都能監(jiān)聽某個topic,并都能夠收到相同消息的拷貝。比如,考慮發(fā)布者廣播了股票報價這樣一種情況。如果任何特定的訂閱者當前沒有連接,并錯過了很好的報價,發(fā)布者不會去關注。相比之下,點對點session很可能傾向于另一端特定應用的一對一對話。在這種情形下,每條消息都值要緊。

另外,消息所代表數(shù)據(jù)信息的范圍和多樣性也是一個因素。使用pub/sub時,消息是基于特定topic提供的過濾功能來分發(fā)到消費者的。即使當消息是用于和某個已知的應用建立一對一對話,使用多個topic的pub/sub來隔離不同類型的消息也是pub/sub的優(yōu)勢所在。每種消息類型能單獨通過各自的消費者和onMessage()監(jiān)聽器來處理。

當僅僅想讓特定接收者處理一次給定消息時,點對點更加方便。這也許是這兩種模型最關鍵的區(qū)別:p2p保證僅僅有一個消費者處理每條消息。當消息需要依次單獨處理時,這一點尤為重要。

實體和會話bean不該接收消息

    JmsClient_1用于消費TravelAgent EJB生產(chǎn)的消息。那么,其他的實體,或會話Bean也能接收哪些消息嗎?答案是肯定的,但那可不是好辦法。

實體和會話Bean會對來自EJB客戶的Java RMI調(diào)用作出響應,但不能編寫為,類似消息驅(qū)動Bean一樣,對JMS消息的響應。這意味著,不可能寫消息驅(qū)動的會話,或?qū)嶓wBean。EJB的這種對JMS消息響應的局限性,使得消息驅(qū)動Bean為什么會在EJB 2.0中引入的原因。消息驅(qū)動Bean被設計成消費來自topic或queue的消息。消息驅(qū)動Bean補充了以前EJB中的不足,我們將在下一節(jié)給出如何編寫它們的例子。

    開發(fā)實體或會話Bean來消費來自業(yè)務方法的JMS消息時可能的,但是這個方法必須首先被EJB客戶調(diào)用。比如,調(diào)用Hypothetical EJB中的業(yè)務方法,其中設置了JMS session并試著查看來自queue的消息:

public class HypotheticalBean implements javax.ejb.SessionBean {

    InitialContext jndiContext;



    public String businessMethod() {



        try{



            QueueConnectionFactory factory = (QueueConnectionFactory)

                jndiContext.lookup("java:comp/env/jms/QueueFactory");



            Queue topic = (Queue)

                jndiContext.lookup("java:comp/env/jms/Queue");



            QueueConnection connect = factory.createQueueConneciton();

            QueueSession session = connect.createQueueSession(true,0);

            QueueReceiver receiver = session.createReceiver(queue);



            TextMessage textMsg = (TextMessage)receiver.receive();

        

            connect.close();

            

            return textMsg.getText();



        } catch(Exception e) {

            throws new EJBException(e);

        }



    }

    ...

}


消息消費者,QueueReceiver,用于取得queue中的消息。盡管程序設計正確,但這是很危險的操作,因為對QueueReceiver.receive()的調(diào)用將諸塞當前線程,直到消息可用為止。如果消息不會發(fā)送到接收者的queue中,該線程將一直被諸塞。換句話說,如果沒有消息發(fā)送到這個queue中,QueueReceiver將一直等待下去。

當然也有一些擇中的辦法,使得receive()方法變得更安全。比如,receive(long timeout)給出了等待時間,一旦超過了這個時間,如果消息還沒到達,QueueReceiver將停止諸塞當前線程,并放棄該消息。同時,也有receiveNoWait()方法,它會檢查消息,如果沒有等待,則返回null,因此避免了線程諸塞。

    盡管這些receive()方法更安全,但仍然是危險的操作。不能夠保證receive()方法預期運行、或者程序員的失誤(比如,使用了錯誤的receive()方法),等等這些所帶來的風險都是很大的。另外,消息驅(qū)動Bean提供了強有力、簡單的企業(yè)Bean ,并專門為消費JMS消息而設計的。本書建議不要試著在實體,或會話Bean 中消費消息。

JMS更多內(nèi)容

    JMS(包括一般意義上的企業(yè)消息),代表了分布式計算中一種強有力的典范。用本人的觀點理解,Java消息服務和EJB自身同等重要,在使用JMS開發(fā)之前一定要理解它。

    盡管本章給出了JMS的總體概述,但只是給出足夠的材料為下一節(jié)討論消息驅(qū)動Bean打下基礎。JMS具有很多的特性和細節(jié),以至于本書不可能包含內(nèi)容廣泛的JMS。為理解JMS以及如何使用它,需要讀者獨立研究它。JMS的詳細材料,《Java消息服務》,Richard Monson-Haefel和David Chappell(O’Reilly)。花時間學習JMS是很值得的。

待續(xù)。。。。。。。。

bill-轉(zhuǎn)自:csdn進入討論組討論。

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永城市| 广昌县| 开远市| 金山区| 锡林郭勒盟| 句容市| 招远市| 梁河县| 新蔡县| 库尔勒市| 双桥区| 肥城市| 平舆县| 衢州市| 安徽省| 江北区| 南靖县| 宁德市| 兰溪市| 沈阳市| 花莲市| 惠来县| 民权县| 贵德县| 肥西县| 二手房| 丹凤县| 即墨市| 赞皇县| 闽侯县| 麻城市| 凭祥市| 塘沽区| 安远县| 额敏县| 铁岭县| 资中县| 蓬安县| 顺昌县| 光山县| 宣威市|