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

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

EnterpriseJavaBeansDistilled

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

topicconnectionfactory 和 Topic

為發(fā)送JMS消息,需要一個(gè)到JMS供應(yīng)者的連接和用于消息的目的地地址。使用JMS連接工廠可以建立到JMS供應(yīng)者的連接。同時(shí),使用Topic對(duì)象來標(biāo)識(shí)消息的目的地地址。這兩者都可通過TravelAgent EJB的JNDI ENC服務(wù)獲得:

T
opicConnectionFactory factory = (TopicConnectionFactory)

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

        

Topic topic = (Topic)

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


   其中,JMS中的TopicConnectionFactory在功能上類似于JDBC中的DataSource。正如DataSource提供對(duì)數(shù)據(jù)庫的連接一樣,TopicConnectionFactory提供對(duì)消息路由器的JMS連接。(這種類推并不完美。也可以說Topicsession類似于DataSource,因?yàn)檫@兩者都是事務(wù)資源連接。)

Topic對(duì)象本身表示了獨(dú)立于網(wǎng)絡(luò)的目的地,即消息的地址。在JMS中,消息被發(fā)送到目的地,或者是topic,或者queue,而不是直接給其他的應(yīng)用程序。Topic類似于郵件列表或新聞組。任何訂閱了該topic消息服務(wù)的應(yīng)用程序可以發(fā)送和接收來自該topic的消息。當(dāng)JMS客戶收到來自topic的消息時(shí),可以說,這個(gè)客戶訂閱了該topic。JMS使得,應(yīng)用借助于目的地來互發(fā)消息,從而降低了應(yīng)用的耦合度。其中的,目的地起著虛擬通道(virtual channel)的作用。

當(dāng)然,JMS也支持另外一種目的地類型,Queue。后面的內(nèi)容將解釋這兩者的區(qū)別。

TopicConnection 和 TopicSession

在這里,使用TopicConnectionFactory來創(chuàng)建TopicConnection,一種對(duì)JMS供應(yīng)者的實(shí)際連接:

TopicConnection connect = factory.createTopicConnection();



TopicSession session = connect.createTopicSession(true,0);

一旦獲得TopicConnection,就可以使用它創(chuàng)建TopicSession。TopicSession對(duì)象使得Java開發(fā)者能夠組合發(fā)送和接收消息動(dòng)作。在這種情形下,只需要單個(gè)TopicSession。然而,提供多個(gè)TopicSession對(duì)象經(jīng)常會(huì)帶來很多好處:如果使用多線程生產(chǎn)和消費(fèi)消息,需要?jiǎng)?chuàng)建不同的Session以滿足每個(gè)線程對(duì)它的訪問。這是因?yàn)镴MS Session對(duì)象使用單線程模型,從而阻止了多個(gè)線程對(duì)單個(gè)Session的并發(fā)訪問。創(chuàng)建TopicSession的線程通常是使用該Session的生產(chǎn)者和消費(fèi)者(即,TopicPublisher和TopicSubsriber對(duì)象)。如果想使用多線程技術(shù)來生產(chǎn)和消費(fèi)消息,則需要?jiǎng)?chuàng)建每個(gè)線程使用的Session對(duì)象。

其中,createTopicSession()有兩個(gè)參數(shù):

createTopicSession(boolean transacted, int acknowledgeMode)

    在EJB 2.0規(guī)范中給出,運(yùn)行時(shí)會(huì)對(duì)這些參數(shù)視而不見,因?yàn)镋JB容器管理事務(wù),并從JNDI ENC中得到任何JMS資源的確認(rèn)模式。規(guī)范建議開發(fā)者分別使用true和0作為transacted和acknowledgeMode參數(shù)的值。但既然規(guī)范是這樣規(guī)定的,如何給出這些參數(shù)值不會(huì)有任何關(guān)系。但不幸的是,并不是所有的產(chǎn)品廠商會(huì)遵循這部分內(nèi)容。有些廠商會(huì)遵循規(guī)范,但有些不會(huì)。參考產(chǎn)品文檔以尋求在容器管理和Bean管理事務(wù)中這些參數(shù)的正確取值。

在使用完TopicConnection后釋放它以節(jié)省資源,是一個(gè)良好的編程習(xí)慣。

TopicConnection connect = factory.createTopicConnection();

...



connect.close();

TopicPublisher

使用TopicSession創(chuàng)建TopicPublisher,從而可以從TravelAgent EJB中發(fā)送消息到Topic對(duì)象給定的目的地中。任何訂閱該topic的JMS客戶都將收到該消息的拷貝:

TopicPublisher publisher = session.createPublisher(topic);



TextMessage textMsg = session.createTextMessage();

textMsg.setText(ticketDescription);

publisher.publish(textMsg);

消息類型

in JMS, a message is a Java object with two parts: a header and a message body. The header is composed of delivery information and metadata, while the message body carries the application data, which can take several forms: text, serializable objects, byte streams, etc. The JMS API defines several message types (TextMessage, MapMessage, ObjectMessage, and others) and PRovides methods for delivering messages to and receiving messages from other applications.

    在JMS中,消息是由兩部分構(gòu)成的Java對(duì)象:消息頭(header)和消息體。消息頭由分發(fā)信息和原數(shù)據(jù)組成,而消息體是應(yīng)用程序數(shù)據(jù),現(xiàn)支持的消息體格式有:文本、序列化對(duì)象、字節(jié)流等等。JMS API定義了幾種消息類型(TextMessage、MapMessage、ObjectMessage等)并提供了用于在應(yīng)用間分發(fā)和接收消息的方法。

比如,將TravelAgent EJB作如下改變,使得它發(fā)送MapMessage而不是TextMessage消息:


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

...

TopicPublisher publisher = session.createPublisher(topic);


MapMessage mapMsg = session.createTextMessage();

mapMsg.setInt("CustomerID", ticket.customerID.intValue());

mapMsg.setInt("CruiseID", ticket.cruiseID.intValue());

mapMsg.setInt("CabinID", ticket.cabinID.intValue());

mapMsg.setDouble("Price", ticket.price);



publisher.publish(mapMsg);

其中,接收該消息的JMS客戶能夠通過名字訪問MapMessage的屬性(CustomerID、CruiseID、CabinID、和Price)。

    換過一種做法,在TravelAgent EJB中使用ObjectMessage類型的消息,從而可以發(fā)送完整的TicketDO對(duì)象。其中,該消息實(shí)現(xiàn)了Java序列化。

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

...

TopicPublisher publisher = session.createPublisher(topic);



ObjectMessage objectMsg = session.createObjectMessage();

ObjectMsg.setObject(ticket);



publisher.publish(objectMsg);

除了TextMessage、MapMessage和ObjectMessage,JMS還提供了兩種其他的消息類型:StreamMessage和BytesMessage。StreamMessage把I/O流的內(nèi)容作為消息有效載荷。同時(shí),BytesMessage操作字節(jié)數(shù)組,即opaque data。

xml配置描述符

When a JMS resource is used, it must be declared in the bean's XML deployment descriptor, in a manner similar to the JDBC resource used by the Ship EJB in Chapter 10:

使用JMS資源時(shí),必須在EJB的XML配置描述符中聲明。其操作方式類似于第10章Ship EJB中的JDBC資源的聲明。

<enterprise-beans>

    <session>

        <ejb-name>TravelAgentBean</ejb-name>

        ...

        <resource-ref>

            <res-ref-name>jms/TopicFactory</res-ref-name>

            <res-type>javax.jms.TopicConnectionFactory</res-type>

            <res-auth>Container</res-auth>

        </resource-ref>

        <resource-ref>

            <res-ref-name>jdbc/titanDB</res-ref-name>

            <res-type>javax.sql.DataSource</res-type>

            <res-auth>Container</res-auth>

        </resource-ref>

        <resource-env-ref>

            <resource-env-ref-name>jms/TicketTopic</resource-env-ref-name>

            <resource-env-ref-type>javax.jms.Topic</resource-env-ref-type>

        </resource-env-ref>

        ...

    </session>

其中,用于JMS TopicConnectionFactory的<resource-ref>,類似于JDBC DataSource中的<resource-ref>聲明:聲明JNDI ENC名字、接口類型和授權(quán)協(xié)議。除了<resource-ref>之外,TravelAgent EJB還必須聲明<resource-env-ref>,這項(xiàng)元素列舉出和< resource-ref >相關(guān)的任何“被管理對(duì)象”。在這里,聲明Topic以用于發(fā)送ticket消息。在部署階段,部署者將把<resource-ref>和<resource-ref>中聲明的JMS TopicConnectionFactory和Topic映射到JMS工廠和topic。

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

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

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



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 瓮安县| 乌兰县| 资源县| 闽清县| 高雄市| 长顺县| 嘉善县| 晋中市| 洪雅县| 宁德市| 祥云县| 磴口县| 红安县| 通海县| 甘谷县| 富蕴县| 陕西省| 鄯善县| 马龙县| 大邑县| 邻水| 同德县| 周至县| 扎鲁特旗| 泰来县| 武功县| 仲巴县| 尚志市| 平武县| 萍乡市| 资溪县| 隆安县| 鸡西市| 溧水县| 湖州市| 涞水县| 榆林市| 河源市| 都安| 定南县| 西林县|