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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

EnterpriseJavaBeansDistilled......

2019-11-18 16:19:14
字體:
供稿:網(wǎng)友
消息驅(qū)動bean(續(xù))

jms是異步的

JMS消息的一個主要優(yōu)勢在于它是異步的。換句話說,JMS客戶能發(fā)送消息,而無需等待回復(fù)。我們來比較一下它和java RMI同步發(fā)送消息的靈活性。RMI是一種用于組裝事務(wù)組件的極好選擇,但在使用上很受限。每次客戶調(diào)用EJB的方法時(shí),都會因等待方法執(zhí)行結(jié)果而諸塞當(dāng)前線程。這種“l(fā)ock-step”處理使得客戶依賴于EJB服務(wù)器的可用性,從而導(dǎo)致了客戶和EJB的緊耦合。

在JMS中,客戶異步發(fā)送消息到目的地(topic或queue),同時(shí)其他的JMS客戶也能從該目的地地址接收消息。當(dāng)JMS客戶發(fā)送消息時(shí),它不用等待回復(fù)。因?yàn)橄l(fā)送到路由器,路由器負(fù)責(zé)將消息分發(fā)給其他的JMS客戶。發(fā)送消息的客戶和接收消息的客戶形成了松耦合,因?yàn)榘l(fā)送者不再依賴于接受者的可用性。

    RMI的這種限制使得JMS成為了,用于和其他應(yīng)用通訊,極為誘人的替代品。使用標(biāo)準(zhǔn)的JNDI ENC,EJB能獲得到JMS供應(yīng)者的JMS連接,并用連接分發(fā)異步消息給其他的應(yīng)用。比如,TravelAgent會話Bean可以使用JMS來通知其他的應(yīng)用程序,預(yù)定已經(jīng)處理過了,

在這種情形下,接收來自TravelAgent EJB的JMS消息的應(yīng)用可能是消息驅(qū)動Bean,或者是企業(yè)中的其他應(yīng)用,或者是其他組織中的應(yīng)用,這些組織因?yàn)楸桓嬷A(yù)定已經(jīng)完成而受益。還可能是,一起分享信息的商業(yè)合作者,或者是添加客戶到目錄郵件列表的內(nèi)部市場應(yīng)用程序。

JMS使得EJB發(fā)送消息而沒有出現(xiàn)諸塞。EJB不知道消息接收者,因?yàn)樗鼘⑾l(fā)送到虛擬通道(目的地),而不是直接給另外的應(yīng)用。應(yīng)用能夠選擇從哪個虛擬通道接收消息,并接受新預(yù)定的通知。

    企業(yè)消息有趣的一方面是,這種技術(shù)本身的松耦合、異步特定意味著:發(fā)送者的事務(wù)和安全context并沒有對消息的接收者形成影響。比如,當(dāng)TravelAgent EJB發(fā)送票務(wù)消息時(shí),JMS供應(yīng)者可能要鑒定它,但它的安全context并沒有給接收該消息的JMS客戶形成影響。當(dāng)JMS客戶接收到來自TravelAgentEJB的消息時(shí),它對消息發(fā)送的安全context并沒有概念。其實(shí)事實(shí)就是這樣,因?yàn)榘l(fā)送者和接收者在使用不同安全管理的操作環(huán)境中。

類似地,事務(wù)也從不在發(fā)送者和接收者之間有關(guān)系。首先,發(fā)送者對接收者沒有概念。如果消息發(fā)送到存在一個,或成千上萬個接收者的topic中,在這種模糊的環(huán)境中管理這種分布式事務(wù)不太現(xiàn)實(shí)。另外,接收消息的客戶可能在消息發(fā)送后很長時(shí)間內(nèi)都沒有收到它,因?yàn)樗鼈兣R時(shí)down機(jī)了,或者不能夠接收到消息。JMS強(qiáng)有力的關(guān)鍵點(diǎn)在于它允許發(fā)送者和接收者是臨時(shí)的松耦合。事務(wù)一般都是快速執(zhí)行的,因?yàn)槭挛镦i定資源,具有不可預(yù)期的長時(shí)間事務(wù)的可能性也太不現(xiàn)實(shí)。

A JMS client can, however, have a distributed transaction with the JMS PRovider so that it manages the send or receive Operation in the context of a transaction. For example, if the TravelAgent EJB's transaction fails for any reason, the JMS provider will discard the ticket message sent by the TravelAgent EJB. Transactions and JMS are covered in more detail in Chapter 14.

    然而,JMS客戶能夠和JMS供應(yīng)者有分布式事務(wù),從而能夠在同一事物上下文中管理發(fā)送和接收操作。比如,如果TravelAgent EJB事務(wù)由于某種原因失敗,JMS供應(yīng)者將丟棄TravelAgent EJB發(fā)送的票務(wù)消息。本書第14章有事務(wù)和JMS的詳細(xì)闡述。

jms消息模型:發(fā)布-訂閱 和 點(diǎn)對點(diǎn)

JMS提供了兩種消息模型:發(fā)布-訂閱和 點(diǎn)對點(diǎn)。JMS規(guī)范稱之為,messaging domains。在JMS術(shù)語中,發(fā)布-訂閱 和 點(diǎn)對點(diǎn)經(jīng)常分別縮寫為pub/sub和p2p(或PTP).本章這兩種叫法都有。

    簡而言之,發(fā)布-訂閱用于一對多廣播式消息,然而點(diǎn)對點(diǎn)用于一對一分發(fā)消息

發(fā)布-訂閱

在發(fā)布-訂閱消息中,生產(chǎn)者能通過稱之為topic的虛擬通道將消息發(fā)送給多個消費(fèi)者。消費(fèi)者可以選擇訂閱的topic。任何發(fā)送到topic的消息會將分發(fā)到所有訂閱了它的消費(fèi)者。每個消費(fèi)者會接收到每條消息的一份拷貝。發(fā)布-訂閱模型大體上是一個基于推技術(shù)的模型,因?yàn)橄詣訌V播到消費(fèi)者,而不需消費(fèi)者向它們發(fā)送請求或?yàn)樾孪ull topic。

在發(fā)布-訂閱模型中,發(fā)送消息的生產(chǎn)者不依賴于接收消息的消費(fèi)者。比如,使用發(fā)布-訂閱的JMS客戶能夠建立持久的訂閱,其間允許消費(fèi)者斷開、以后連接,并收集消費(fèi)者斷開期間發(fā)布的消息。

本章的TravelAgent EJB使用發(fā)布-訂閱編程模型,并使用Topic對象作為目的地。

點(diǎn)對點(diǎn)

點(diǎn)對點(diǎn)消息模型允許JMS客戶借助于,稱之為queue的虛擬通道來同步和異步,發(fā)送和接收消息。其中點(diǎn)對點(diǎn)消息模型,一般都是基于pull(或者poll)的模型,消息需要客戶向queue發(fā)送請求,而不是自動推到客戶端。(JMS規(guī)范沒有明確給出必須如何實(shí)現(xiàn)發(fā)布-訂閱和點(diǎn)對點(diǎn)模型。這兩者都可以使用推技術(shù)或拉技術(shù),但從概念上講發(fā)布-訂閱是推和點(diǎn)對點(diǎn)是拉。)

queue可能有多個接收者,但只有一個接收者會接收到每條消息。正如圖13-2所示,JMS供應(yīng)者會關(guān)注消費(fèi)消息的JMS客戶,確保每條消息僅僅被一個JMS客戶消費(fèi)掉。JMS規(guī)范沒有給出在多個接收者之間分發(fā)消息的規(guī)則。

    用于點(diǎn)對點(diǎn)的消息API類似于發(fā)布-訂閱中的。下面給出的代碼演示了,如何修改TravelAgent EJB使得它使用基于queue的點(diǎn)對點(diǎn)API,而不是前述例子中使用的基于topic的發(fā)布-訂閱模型。

public TicketDO bookPassage(CreditCardDO card, double price)

    throws IncompleteConversationalState {

        ...



        TicketDO ticket = new TicketDO(customer,cruise,cabin,price);





        String ticketDescription = ticket.toString();



        QueueConnectionFactory factory = (QueueConnectionFactory)

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

        

        Queue queue = (Queue)

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



        QueueConnection connect = factory.createQueueConneciton();



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



        QueueSender sender = session.createSender(queue);



        TextMessage textMsg = session.createTextMessage();

        textMsg.setText(ticketDescription);

        sender.send(textMsg);

        connect.close();



        return ticket;

    } catch(Exception e) {

        throw new EJBException(e);

    }

}


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

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

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



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兰溪市| 师宗县| 宜宾市| 无棣县| 茂名市| 海林市| 辉南县| 达孜县| 颍上县| 贵港市| 罗城| 城步| 基隆市| 观塘区| 宜良县| 仙居县| 明水县| 晋江市| 呼伦贝尔市| 朝阳县| 桃园市| 崇明县| 革吉县| 阿拉善右旗| 元朗区| 太仓市| 灌云县| 连城县| 桂阳县| 石台县| 明光市| 清河县| 本溪市| 七台河市| 天台县| 岗巴县| 江华| 滦平县| 绵阳市| 穆棱市| 玉田县|