




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JMS和Message-DrivenBean15.1JMS
15.2Message-DrivenBean
15.1JMS
15.1.1概述
15.1.2JMSAPI的基本概念
15.1.3JMSAPI编程模型
15.1.4JMS应用程序开发15.1.1概述 JavaMessageService(JMS)是一组JavaAPI,应用程序可以使用这些API创建、发送和读取消息。
JMS的目的是提供给消息系统客户一个固定的接口,而且与底层的消息提供者无关。这样,客户端的应用程序可以在不同的机器和操作系统中移植,而且能在不同的消息系统产品之间转移。JMS客户端都是建立在JAVA技术上的,从而也能使用其他JavaAPI,如JDBC数据库连接,使用JavaBean组件模型,JDNI名字服务,JTA客户端事务处理控制以及J2SE和J2EEAPI来实现企业级应用服务程序。15.1.1概述
以下三种情况,需要考虑使用JMS消息服务:要求一个组件不依赖于其他组件的接口,这样这个组件可以方便的替换。要求整个程序在运行时,不需要所有的组件都处于激活状态。应用程序的商业逻辑要求一个组件向另外一个组件发送信息以后,它不需要等待该组件的返回信息,而能够继续完成其他工作。15.1.1概述
在J2EE1.3版本中,JMSAPI主要有以下特点:应用程序客户端、EnterpriseBean组件和Web组件都可以发送或同步接受JMS消息。应用程序客户端还可以异步地接受信息,但是Applets并不支持JMSAPI。一种新的EnterpriseBean-Message-DrivenBean可用来异步地接受信息。消息的发送和接受可以使用分布式事务处理。15.1.2JMSAPI的基本概念一个JMS应用程序主要包含以下几个部分:JMS消息服务提供者(JMSProvider)
JMS消息服务提供者是一个消息服务系统,这个系统实现了基本的JMS接口,并提供了对消息服务进行管理的方法。JMS客户端
JMS客户端指的是生产或接受消息的程序或组件。15.1.2JMSAPI的基本概念一个JMS应用程序主要包含以下几个部分:Message对象
Message对象是JMS客户端之间通信的消息载体。
管理对象管理对象是消息服务提供者创建的对象,客户端需要使用这些对象进行通信,主要有两种管理对象:目标对象(Destination)和连接对象工厂,目标对象是消息的代理对象,连接对象工厂用于创建客户端到目标对象的连接。15.1.2JMSAPI的基本概念
通常JMS消息服务提供者支持两种消息传递机制:点对点(PointtoPoint)在点对点的消息系统中,消息分发给一个单独的使用者。它维持一个"进入"消息队列。消息应用程序发送消息到一个特定的队列,而客户端从一个队列中得到消息。15.1.2JMSAPI的基本概念发布/登记(Publish/Subscribe)发布/订阅消息系统支持一个事件驱动模型,消息产生者和使用者都参与消息的传递。产生者发布事件,而使用者订阅感兴趣的事件,并使用事件。产生者将消息和一个特定的主题(Topic)连在一起,消息系统根据使用者注册的兴趣,将消息传给使用者。15.1.2JMSAPI的基本概念
在JMS规范中,对于消息接受的“同步”和“异步”定义得非常细致,客户端可以采用两种方法来接受消息:同步接受
receive()方法。异步接受 消息监听器的onMessage()方法 15.1.3JMSAPI编程模型
目标对象队列对象(queue)和主题对象(topic)。通过JMS服务提供者的工具来创建的。连接对象工厂负责创建客户端到目标对象的连接。
Connection对象由连接对象工厂对象创建。15.1.3JMSAPI编程模型Session对象客户端要和目标对象通信,首先必须先建立一个会话。使用Session对象可以创建消息的生产者、使用者和消息。消息生产者(MessageProducer)消息使用者(MessageConsumer)
Message对象15.1.3JMSAPI编程模型JMSAPI编程模型15.1.3JMSAPI编程模型ConnectionFactory是一个客户端用来创建一个Connection的管理对象。由于在Connection创建时有授权和通信建立过程,因此这个对象是比较大的。
Destination对象将一个消息的目的和服务提供者有关的地址及配置信息包装起来。
Session是JMS实体,用来支持事务处理和异步消息消费。JMS并不需要客户端的代码用于异步消息消费或能处理多个并发消息。通常,事务的复杂性都由一个Session来封装。15.1.3JMSAPI编程模型
一个Session是一个原子单位的工作,与数据库的事务一样,要实现多线程事务比较困难。Session提供了在一个线程编程模式下的并发的优点。
MessageProducer和MessageConsumer对象由Session对象创建。用于发送和接受消息。为了确保消息的传递,JMS服务提供者处理的消息都要处于PERSISTENT模式。PERSISTENT模式使得JMS提供者出问题后,也能让消息保存下来。
Session,MessageProducer和MessageConsumer都不支持并发,而ConnectionFactory,Destination和Connection都支持并发。15.1.3JMSAPI编程模型创建目标对象创建队列对象
j2eeadmin–addJmsDestinationqueue_namequeue
创建主题对象
j2eeadmin–addJmsDestinationtopic_nametopic2.创建连接工厂对象
j2eeadminaddJmsFactoryjnid_namequeue
或
j2eeadminaddJmsFactoryjnid_nametopic15.1.3JMSAPI编程模型3.创建连接对象
QueueConnectionqueueConnection= queueConnectionFactory.createQueueConnection()
或
TopicConnectiontopicConnection= topicConnectionFactory.createtopicConnection()15.1.3JMSAPI编程模型4.建立会话 创建QueueSession对象
QueueSessionqueueSession= queueConnection.createQueueSession(ture,0)
创建TopicSession对象
TopicSessiontopicSession= topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE)15.1.3JMSAPI编程模型5.建立消息的生产者 创建QueueSender对象
QueueSenderqueueSender= queueSession.createSender(myQueue)
创建TopicPublisher对象
TopicPublishertopicPublisher= topicSession.createPublisher(myTopic)15.1.3JMSAPI编程模型6.发送消息
queueSender.send(message)
或
topicPublisher.publish(message)15.1.3JMSAPI编程模型7.消息接受 创建QueueReceiver对象
QueueReceiverqueueReceiver= queueSession.createReceiver(myQueue)
创建TopicSubscriber对象
TopicSubscribertopicSubscriber= topicSession.createSubscriber(myTopic)15.1.3JMSAPI编程模型7.消息接受 同步接受
queueConnection.start();Messagem=queueReceiver.receive()
或
topicConnection.start();Messagem=topicSubscriber.receive()15.1.3JMSAPI编程模型7.消息接受 异步接受(使用消息监听器)
创建消息监听对象
QueueListenerqueueListener=newQueueListener()TopicListenertopicListener=newTopicListener()
注册消息监听对象
queueReceiver.setMessageListener(queueListener) topicSubscript.setMessageListener(topicListener)15.1.4JMS应用程序开发JMS中的消息创建一个JMS客户端程序JMS中的消息
在消息系统中,应用程序之间通信的关键是消息。因此使用JMS必须要先理解消息。
JMS中的消息在JMS中,消息由三部分组成:
MESSAGEHEADER用于识别消息,比如用于判断一个给定的消息是否是一个"订阅者"。
PROPERTIES用于与应用程序相关的,提供者相关的和可选项的信息
BODY是消息的内容,支持几种格式,包括TextMessage
(对String一个简单的封装)和ObjectMessage(对任意对象的封装,但必须支持序列化),也支持其他格式。JMS中的消息下面是JMS定义的两种主要消息格式:
TextMessage
一个TextMessage是一个String对象的封装。在只有文本对象传递时,是很有用的。它假设许多消息系统是建立在XML上的。从而TextMessage就可以成为包装它们的容器。
创建一个TextMessage对象很简单,如下面的代码:
TextMessagemessage=session.createTextMessage();
message.setText("Hello,world!");JMS中的消息下面是JMS定义的两种主要消息格式:
ObjectMessage
如名字所示,它是对一个Java对象的封装的消息。任何可序列化的Java对象都能用于ObjectMessage,如果必须将多个对象封装在一个消息里传递,可以使用Collection对象来包括多个序列化对象。下面是创建一个ObjectMessageObjectMessagemessage=session.createObjectMessage();
message.setObject(myObject);
创建一个JMS客户端程序一个典型的JMS客户端由下面的几个基本步骤来创建:
(1)创建一个到消息系统提供者的连接(Connection)
(2)创建一个Session,用于接收和发送消息
(3)创建MessageProducer和MessageConsumer来创建和接收消息
当完成了上述步骤后,一个消息产生者客户端将创建并发布消息到一个主题,而消息使用者客户端会接收与一个主题相关的消息。(1)创建一个Connection一个Connection提供客户端对底层的消息系统的访问。并实现资源的分配和管理。通过使用一个ConnectionFactory来创建一个Connection,通常用JDNI来指定:Connectionmessage=newinitialContext();TopicConnectionFactorytopicConnectionFactory=(TopicConnectionFactory);
topic=(Topic)jndiContext.lookup(topicName);
TopicConnectiontopicConnection=topicConnectionFactory.createTopicConnection();(2)创建一个Session
Session是一个比较大的JMS对象,他提供了生产和消费消息的手段。用于创建消息使用者和消息产生者。
TopicSessiontopicSession=topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
两个参数用于控制事务和消息确认。
(2)创建一个Session(false,Session.AUTO_ACKNOWLEDGE);第一个参数用于控制事务,第二个参数表示Session自动进行
(3)定位一个Topic
用JDNI来定位一个Topic,Topic用于识别发送或接收的消息,在发布/订阅系统中。订阅者订阅一个给定的Topic,而发布者将它发布的消息与一个Topic相连。下面是创建一个Topic"WeatherReport“TopicweatherTopic=messaging.lookup("WeatherReport");
(4)启动Connection
在上面的初始化步骤之后,消息流是禁止的,用于防止在初始化时发生不可预料的行为。一旦初始化结束,必须让Connection启动消息系统。
topicConnection.start();
(5)创建一个消息产生者
在发布/订阅里,一个产生者发布消息到一个指定的Topic。下面的代码显示创建一个产生者,以及后续的建立和发布一个简单文本消息。
TopicPublisherpublisher=session.createPublisher(weatherTopic);
TexeMessagemessage=session.createMessage();
message.setText("ssss");
publisher.publish(message);(6)接受消息
下面是一个消息使用者的代码topicConnection=topicConnectionFactory.createTopicConnection();topicSession=topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);topicSubscriber=topicSession.createSubscriber(topic);topicListener=newMsgListener();topicSubscriber.setMessageListener(topicListener);
topicConnection.start();15.2Message-DrivenBean
15.2.1Message-DrivenBean(MDB)概述
15.2.2编写Message-DrivenBean15.2.3MDB与SessionBean的协同工作15.2.4MDB与EntityBean的协同工作15.2.1Message-DrivenBean(MDB)概述MDB是一种JMS消息使用者,一个MDB从消息队列或消息主体中读取消息,与SessionBean和EntityBean相比,它主要有以下几个特点:15.2.1Message-DrivenBean(MDB)概述MDB没有home、remote、localhome和local接口。MDB只是提供接受消息的方法,客户端无法直接与MDB打交道。
MDB的运行是无状态的,所有同一类型的MDB实例都是一样的,但是不同的实例却可能属于不同的会话对象或连接对象。
MDB的生命周期由EJB容器控制,这一点和SessionBean和
EntityBean是一样的。
MDB的输入参数只有一种类型,那就是消息对象。15.2.1Message-DrivenBean(MDB)概述
客户端和Message-DrivenBean是完全独立的,客户端无法直接调用一个MDB的方法,而是由消息服务器负责把消息发送给MDB。一个MDB到底从哪个消息队列或主题中读取消息是在部署描述文件中说明的。15.2.2编写Message-DrivenBean
一个MDB相当于一个消息监听器,它能监听消息队列或主题中的消息,并能从中读取消息,消息的发送方可以其他EnterpriseBean,也可以Web组件,甚至可以是其他语言编写的应用程序。每一个Message-DrivenBean都必须实现两个接口:javax.ejb.MessageDrivenBean和javax.jms.MessageListener接口,下面是这两个接口的具体定义:15.2.2编写Message-DrivenBean
publicinterfacejavax.jms.MessageListener{ publicvoidonMessage(Messagemessage);}publicinterfacejavax.ejb.MessageDrivenBeanextendsEnterpriseBean{ publicvoidejbRemove()throwsEJBException; publicvoidsetMessageDrivenContext( MessageDrivenContextctx)throwsEJBException;}15.2.2编写Message-DrivenBean
第一个接口中的onMessage方法的作用和消息监听中的这个方法一样,MDB需要实现这个方法,来告诉容器当消息到来时如何处理消息。15.2.2编写Message-DrivenBean
第二个接口首先是从EnterpriseBean接口继承的,所以同时也继承了EnterpriseBean接口的ejbCreate方法。当有些MDB需要发送消息,或者它需要调用receive方法同步的从某个消息队列或主题接受消息,也就是说MDB需要在程序中建立连接、创建会话、发送或接受消息,那么就需要在ejbCreate方法中使用JNDI查找连接对象工厂和目标对象,并建立连接;同时在ejbRemove方法中就需要关闭和释放在ejbCreate方法创建的JMSAPI连接;另外MDB还需要实现setMessageDrivenContext方法,在这个方法中把Message-DriveBean和一个MessageDrivenContext对象关联起来,这个MessageDrivenContext对象提供了一些用于管理MDB事务的方法。15.2.2编写Message-DrivenBean
当创建Message-DriveBean实例的时候,EJB容器首先初始化一个MDB实例,然后调用setMessageDrivenContext方法,把一个MessageDrivenContext对象和这个实例关联起来,最后调用ejbCreate方法,这样这个MDB实例就可以开始接受消息了。15.2.2编写Message-DrivenBean
Message-DrivenBean的生命周期
15.2.3MDB与SessionBean的协同工作
Message-Driven只不过是一个消息的使用对象,事实上Message-DrivenBean需要和SessionBean、EntityBean,Web组件等J2EE元素一起协同完成工作。15.2.3MDB与SessionBean的协同工作
这是使用Pub/Sub消息传递机制的JMS&J2EE应用程序,它主要包含一个PublisherSessionBean,这个Bean负责向主题发布消息;还包含一个Message-DrivenBean,它负责接受消息;还有一个客户端向Publisher发送发布消息的指令。这个例子就好像一个新闻服务提供系统,PublisherBean把编辑好的新闻分类,然后交给新闻发布系统准备发布;而Message-DrivenBean则好像一个预定了某类新闻的用户,当新闻发布时,MDB会自动挑选那些与用户要求相符的新闻接受。15.2.3MDB与SessionBean的协同工作
SessionBean与Message-DrivenBean15.2.3MDB与SessionBean的协同工作
1.PublisherSessionBean:PublisherBean2.Message-DrivenBean:MessageBean3.客户端程序:MyAppClient15.2.3MDB与SessionBean的协同工作
应用程序的部署和运行:创建消息主题:jms/MyTopic2.创建连接对象工厂:jms/DurableTopicCF3.创建J2EE应用程序4.打包客户端程序5.打包PublisherSessionBean6.打包Message-DrivenBean7.配置PublisherSession的JNDI名8.部署和运行应用程序
runclient–clientPubSubApp.ear–nameMyAppClient-textauth15.2.3MDB与SessionBean的协同工作
15.2.3MDB与SessionBean的协同工作
15.2.3MDB与SessionBean的协同工作
15.2.3MDB与SessionBean的协同工作
15.2.3MDB与SessionBean的协同工作
15.2.4MDB与EntityBean的协同工作
这个例子包含如下内容:一个发送和接受消息的客户端,3个Message-DrivenBean和一个由容器管理存储的EntityBean。这个例子描述了一个企业的人事部门雇佣新的员工的过程。15.2.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美甲合同转让协议书模板
- 花草租赁解除合同协议书
- 船员培训专项协议书模板
- 网页设计团队外包协议书
- 风力发电安装转让协议书
- 签了购房协议不给签合同
- 电梯加楼梯施工合同协议
- 职工餐厅承包合同协议书
- 门店分红股东协议书范本
- 腺肌病的护理
- 北京市朝阳区2024-2025学年高一下学期期末语文试题(含答案)
- 安徽高危人员管理办法
- 牙外伤护理配合课件
- 2025年辅警招聘考试试题及参考答案
- 2025年湖南省高考物理真题
- 2025年吉林省中考数学试卷真题(含答案详解)
- 医学美容技术专业教学标准(高等职业教育专科)2025修订
- 党课课件含讲稿:以作风建设新成效激发干事创业新作为
- 军事知识科普儿童课件
- 谷歌付费协议书
- 爆破三员安全培训课件
评论
0/150
提交评论