分享
 
 
 

Enterprise JavaBeans Distilled (5)

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Enterprise JavaBeans Distilled

作者: Tnk Luo

第六次:

消息驱动Bean(续)

TopicConnectionFactory 和 Topic

为发送JMS消息,需要一个到JMS供应者的连接和用于消息的目的地地址。使用JMS连接工厂可以建立到JMS供应者的连接。同时,使用Topic对象来标识消息的目的地地址。这两者都可通过TravelAgent EJB的JNDI ENC服务获得:

TopicConnectionFactory factory = (TopicConnectionFactory)

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

Topic topic = (Topic)

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

其中,JMS中的TopicConnectionFactory在功能上类似于JDBC中的DataSource。正如DataSource提供对数据库的连接一样,TopicConnectionFactory提供对消息路由器的JMS连接。(这种类推并不完美。也可以说TopicSession类似于DataSource,因为这两者都是事务资源连接。)

Topic对象本身表示了独立于网络的目的地,即消息的地址。在JMS中,消息被发送到目的地,或者是topic,或者queue,而不是直接给其他的应用程序。Topic类似于邮件列表或新闻组。任何订阅了该topic消息服务的应用程序可以发送和接收来自该topic的消息。当JMS客户收到来自topic的消息时,可以说,这个客户订阅了该topic。JMS使得,应用借助于目的地来互发消息,从而降低了应用的耦合度。其中的,目的地起着虚拟通道(virtual channel)的作用。

当然,JMS也支持另外一种目的地类型,Queue。后面的内容将解释这两者的区别。

TopicConnection 和 TopicSession

在这里,使用TopicConnectionFactory来创建TopicConnection,一种对JMS供应者的实际连接:

TopicConnection connect = factory.createTopicConnection();

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

一旦获得TopicConnection,就可以使用它创建TopicSession。TopicSession对象使得Java开发者能够组合发送和接收消息动作。在这种情形下,只需要单个TopicSession。然而,提供多个TopicSession对象经常会带来很多好处:如果使用多线程生产和消费消息,需要创建不同的Session以满足每个线程对它的访问。这是因为JMS Session对象使用单线程模型,从而阻止了多个线程对单个Session的并发访问。创建TopicSession的线程通常是使用该Session的生产者和消费者(即,TopicPublisher和TopicSubsriber对象)。如果想使用多线程技术来生产和消费消息,则需要创建每个线程使用的Session对象。

其中,createTopicSession()有两个参数:

createTopicSession(boolean transacted, int acknowledgeMode)

在EJB 2.0规范中给出,运行时会对这些参数视而不见,因为EJB容器管理事务,并从JNDI ENC中得到任何JMS资源的确认模式。规范建议开发者分别使用true和0作为transacted和acknowledgeMode参数的值。但既然规范是这样规定的,如何给出这些参数值不会有任何关系。但不幸的是,并不是所有的产品厂商会遵循这部分内容。有些厂商会遵循规范,但有些不会。参考产品文档以寻求在容器管理和Bean管理事务中这些参数的正确取值。

在使用完TopicConnection后释放它以节省资源,是一个良好的编程习惯。

TopicConnection connect = factory.createTopicConnection();

...

connect.close();

TopicPublisher

使用TopicSession创建TopicPublisher,从而可以从TravelAgent EJB中发送消息到Topic对象给定的目的地中。任何订阅该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中,消息是由两部分构成的Java对象:消息头(header)和消息体。消息头由分发信息和原数据组成,而消息体是应用程序数据,现支持的消息体格式有:文本、序列化对象、字节流等等。JMS API定义了几种消息类型(TextMessage、MapMessage、ObjectMessage等)并提供了用于在应用间分发和接收消息的方法。

比如,将TravelAgent EJB作如下改变,使得它发送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类型的消息,从而可以发送完整的TicketDO对象。其中,该消息实现了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流的内容作为消息有效载荷。同时,BytesMessage操作字节数组,即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资源时,必须在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名字、接口类型和授权协议。除了<resource-ref>之外,TravelAgent EJB还必须声明<resource-env-ref>,这项元素列举出和< resource-ref >相关的任何“被管理对象”。在这里,声明Topic以用于发送ticket消息。在部署阶段,部署者将把<resource-ref>和<resource-ref>中声明的JMS TopicConnectionFactory和Topic映射到JMS工厂和topic。

待续。。。。。。。。

(作者其它文章:http://www.csdn.net/develop/author/netauthor/worldheart/ )

谢谢!!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有