收藏 分享(赏)

软件中间件技术unit15.ppt

上传人:无敌 文档编号:363324 上传时间:2018-04-01 格式:PPT 页数:61 大小:841.50KB
下载 相关 举报
软件中间件技术unit15.ppt_第1页
第1页 / 共61页
软件中间件技术unit15.ppt_第2页
第2页 / 共61页
软件中间件技术unit15.ppt_第3页
第3页 / 共61页
软件中间件技术unit15.ppt_第4页
第4页 / 共61页
软件中间件技术unit15.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、JMS 和 Message-Driven Bean,15.1 JMS,15.2 Message-Driven Bean,15.1 JMS,15.1.1 概述,15.1.2 JMS API的基本概念,15.1.3 JMS API编程模型,15.1.4 JMS应用程序开发,15.1.1 概述,Java Message Service (JMS) 是一组Java API,应用程序可以使用这些API创建、发送和读取消息。JMS的目的是提供给消息系统客户一个固定的接口,而且与底层的消息提供者无关。这样,客户端的应用程序可以在不同的机器和操作系统中移植,而且能在不同的消息系统产品之间转移。JMS客户端都是

2、建立在JAVA技术上的,从而也能使用其他Java API,如JDBC数据库连接,使用JavaBean组件模型,JDNI名字服务,JTA客户端事务处理控制以及J2SE和J2EE API来实现企业级应用服务程序。,15.1.1 概述,以下三种情况,需要考虑使用JMS消息服务:要求一个组件不依赖于其他组件的接口,这样这个组件可以方便的替换。要求整个程序在运行时,不需要所有的组件都处于激活状态。应用程序的商业逻辑要求一个组件向另外一个组件发送信息以后,它不需要等待该组件的返回信息,而能够继续完成其他工作。,15.1.1 概述,在J2EE1.3版本中,JMS API主要有以下特点:应用程序客户端、Ent

3、erprise Bean 组件和Web 组件都可以发送或同步接受JMS消息。应用程序客户端还可以异步地接受信息,但是Applets并不支持JMS API。一种新的Enterprise Bean- Message-Driven Bean可用来异步地接受信息。消息的发送和接受可以使用分布式事务处理。,15.1.2 JMS API的基本概念,一个JMS应用程序主要包含以下几个部分:JMS 消息服务提供者(JMS Provider) JMS 消息服务提供者是一个消息服务系统,这个系统实现了基本的JMS接口,并提供了对消息服务进行管理的方法。JMS 客户端 JMS 客户端指的是生产或接受消息的程序或组件

4、。,15.1.2 JMS API的基本概念,一个JMS应用程序主要包含以下几个部分:Message 对象 Message 对象是JMS 客户端之间通信的消息载体。 管理对象 管理对象是消息服务提供者创建的对象,客户端需要使用这些对象进行通信,主要有两种管理对象:目标对象(Destination)和连接对象工厂,目标对象是消息的代理对象,连接对象工厂用于创建客户端到目标对象的连接。,15.1.2 JMS API的基本概念,通常JMS消息服务提供者支持两种消息传递机制:点对点(Point to Point) 在点对点的消息系统中,消息分发给一个单独的使用者。它维持一个进入消息队列。消息应用程序发送

5、消息到一个特定的队列,而客户端从一个队列中得到消息。,15.1.2 JMS API的基本概念,发布/登记(Publish/Subscribe) 发布/订阅消息系统支持一个事件驱动模型,消息产生者和使用者都参与消息的传递。产生者发布事件,而使用者订阅感兴趣的事件,并使用事件。产生者将消息和一个特定的主题(Topic)连在一起,消息系统根据使用者注册的兴趣,将消息传给使用者。,15.1.2 JMS API的基本概念,在JMS规范中,对于消息接受的“同步”和“异步”定义得非常细致,客户端可以采用两种方法来接受消息:同步接受receive()方法。异步接受消息监听器的onMessage()方法,15.

6、1.3 JMS API编程模型,目标对象 队列对象(queue)和主题对象(topic)。通过JMS服务提供者的工具来创建的。 连接对象工厂 负责创建客户端到目标对象的连接。 Connection 对象 由连接对象工厂对象创建。,15.1.3 JMS API编程模型,Session对象 客户端要和目标对象通信,首先必须先建立一个会话。使用Session对象可以创建消息的生产者、使用者和消息。 消息生产者(Message Producer) 消息使用者(Message Consumer) Message 对象,15.1.3 JMS API编程模型,JMS API 编程模型,15.1.3 JMS

7、API编程模型,ConnectionFactory是一个客户端用来创建一个Connection的管理对象。由于在Connection创建时有授权和通信建立过程,因此这个对象是比较大的。 Destination对象将一个消息的目的和服务提供者有关的地址及配置信息包装起来。 Session是JMS实体,用来支持事务处理和异步消息消费。JMS并不需要客户端的代码用于异步消息消费或能处理多个并发消息。通常,事务的复杂性都由一个Session来封装。,15.1.3 JMS API编程模型,一个Session是一个原子单位的工作,与数据库的事务一样,要实现多线程事务比较困难。Session提供了在一个线程

8、编程模式下的并发的优点。 MessageProducer和MessageConsumer对象由Session对象创建。用于发送和接受消息。为了确保消息的传递,JMS服务提供者处理的消息都要处于PERSISTENT模式。PERSISTENT模式使得JMS提供者出问题后,也能让消息保存下来。 Session,MessageProducer和MessageConsumer都不支持并发,而ConnectionFactory,Destination和Connection都支持并发。,15.1.3 JMS API编程模型,创建目标对象 创建队列对象 j2eeadmin addJmsDestination

9、queue_name queue创建主题对象j2eeadmin addJmsDestination topic_name topic2. 创建连接工厂对象j2eeadmin addJmsFactory jnid_name queue或j2eeadmin addJmsFactory jnid_name topic,15.1.3 JMS API编程模型,3. 创建连接对象 QueueConnection queueConnection=queueConnectionFactory.createQueueConnection()或TopicConnection topicConnection=top

10、icConnectionFactory.createtopicConnection(),15.1.3 JMS API编程模型,4. 建立会话创建QueueSession对象 QueueSession queueSession=queueConnection.createQueueSession(ture,0)创建TopicSession对象TopicSession topicSession=topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE),15.1.3 JMS API编程模型,5. 建立消息的生产者创建Queu

11、eSender对象 QueueSender queueSender=queueSession.createSender(myQueue)创建TopicPublisher对象TopicPublisher topicPublisher=topicSession.createPublisher(myTopic),15.1.3 JMS API编程模型,6. 发送消息queueSender.send(message)或topicPublisher.publish(message),15.1.3 JMS API编程模型,7. 消息接受创建QueueReceiver对象 QueueReceiver queu

12、eReceiver=queueSession.createReceiver(myQueue)创建TopicSubscriber对象TopicSubscriber topicSubscriber=topicSession.createSubscriber(myTopic),15.1.3 JMS API编程模型,7. 消息接受同步接受queueConnection.start(); Message m = queueReceiver.receive()或topicConnection.start(); Message m = topicSubscriber.receive(),15.1.3 JMS

13、 API编程模型,7. 消息接受异步接受(使用消息监听器)创建消息监听对象QueueListener queueListener = new QueueListener() TopicListener topicListener = new TopicListener()注册消息监听对象 queueReceiver.setMessageListener(queueListener)topicSubscript.setMessageListener(topicListener),15.1.4 JMS应用程序开发,JMS中的消息 创建一个JMS客户端程序,JMS中的消息,在消息系统中,应用程序之间

14、通信的关键是消息。因此使用JMS必须要先理解消息。,JMS中的消息,在JMS中,消息由三部分组成: MESSAGE HEADER用于识别消息,比如用于判断一个给定 的消息是否是一个订阅者。 PROPERTIES用于与应用程序相关的,提供者相关的和 可选项的信息 BODY是消息的内容,支持几种格式,包括TextMessage (对String一个简单的封装)和ObjectMessage(对任意 对象的封装,但必须支持序列化),也支持其他格式。,JMS中的消息,下面是JMS定义的两种主要消息格式: TextMessage 一个TextMessage是一个String对象的封装。在只有文本对象传递时

15、,是很有用的。它假设许多消息系统是建立在XML上的。从而TextMessage就可以成为包装它们的容器。 创建一个TextMessage对象很简单,如下面的代码: TextMessage message=session.createTextMessage(); message.setText(Hello, world!);,JMS中的消息,下面是JMS定义的两种主要消息格式: ObjectMessage 如名字所示,它是对一个Java对象的封装的消息。任何可序列化的Java对象都能用于ObjectMessage,如果必须将多个对象封装在一个消息里传递,可以使用Collection对象来包括多个

16、序列化对象。下面是创建一个ObjectMessageObjectMessage message=session.createObjectMessage(); message.setObject(myObject);,创建一个JMS客户端程序,一个典型的JMS客户端由下面的几个基本步骤来创建: (1)创建一个到消息系统提供者的连接(Connection) (2)创建一个Session,用于接收和发送消息 (3)创建MessageProducer和MessageConsumer来创建和接收消息 当完成了上述步骤后,一个消息产生者客户端将创建并发布消息到一个主题,而消息使用者客户端会接收与一个主题相

17、关的消息。,(1)创建一个Connection,一个Connection提供客户端对底层的消息系统的访问。并实现资源的分配和管理。通过使用一个ConnectionFactory来创建一个Connection,通常用JDNI来指定: Connection message=new initialContext();TopicConnectionFactory topicConnectionFactory=(TopicConnectionFactory);topic = (Topic) jndiContext.lookup(topicName); TopicConnection topicConne

18、ction =topicConnectionFactory.createTopicConnection();,(2)创建一个Session,Session是一个比较大的JMS对象,他提供了生产和消费消息的手段。用于创建消息使用者和消息产生者。 TopicSession topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); 两个参数用于控制事务和消息确认。,(2)创建一个Session,(false,Session.AUTO_ACKNOWLEDGE);第一个参数用于控制事务,第二个参数

19、表示Session自动进行,(3)定位一个Topic,用JDNI来定位一个Topic,Topic用于识别发送或接收的消息,在发布/订阅系统中。订阅者订阅一个给定的Topic,而发布者将它发布的消息与一个Topic相连。 下面是创建一个Topic WeatherReport“Topic weatherTopic=messaging.lookup(WeatherReport);,(4)启动Connection,在上面的初始化步骤之后,消息流是禁止的,用于防止在初始化时发生不可预料的行为。一旦初始化结束,必须让Connection启动消息系统。topicConnection.start();,(5)

20、创建一个消息产生者,在发布/订阅里,一个产生者发布消息到一个指定的Topic。下面的代码显示创建一个产生者,以及后续的建立和发布一个简单文本消息。TopicPublisher publisher=session.createPublisher(weatherTopic); TexeMessage message=session.createMessage(); message.setText(ssss); publisher.publish(message);,(6)接受消息,下面是一个消息使用者的代码 topicConnection =topicConnectionFactory.creat

21、eTopicConnection();topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);topicSubscriber = topicSession.createSubscriber(topic);topicListener = new MsgListener();topicSubscriber.setMessageListener(topicListener);topicConnection.start();,15.2 Message-Driven Bean,15.2.1 Me

22、ssage-Driven Bean (MDB)概述,15.2.2 编写Message-Driven Bean,15.2.3 MDB与Session Bean的协同工作,15.2.4 MDB与Entity Bean的协同工作,15.2.1 Message-Driven Bean (MDB)概述,MDB是一种JMS消息使用者,一个MDB从消息队列或消息主体中读取消息,与Session Bean 和Entity Bean相比,它主要有以下几个特点:,15.2.1 Message-Driven Bean (MDB)概述,MDB没有home、remote、local home 和local接口。MDB只

23、 是提供接受消息的方法,客户端无法直接与MDB打交道。 MDB的运行是无状态的,所有同一类型的MDB实例都是一样 的,但是不同的实例却可能属于不同的会话对象或连接对象。 MDB的生命周期由EJB容器控制,这一点和Session Bean 和 Entity Bean是一样的。 MDB的输入参数只有一种类型,那就是消息对象。,15.2.1 Message-Driven Bean (MDB)概述,客户端和Message-Driven Bean是完全独立的,客户端无法直接调用一个MDB的方法,而是由消息服务器负责把消息发送给MDB。 一个MDB到底从哪个消息队列或主题中读取消息是在部署描述文件中说明的

24、。,15.2.2 编写Message-Driven Bean,一个MDB相当于一个消息监听器,它能监听消息队列或主题中的消息,并能从中读取消息,消息的发送方可以其他Enterprise Bean,也可以Web组件,甚至可以是其他语言编写的应用程序。 每一个Message-Driven Bean都必须实现两个接口:javax.ejb.MessageDrivenBean和javax.jms.MessageListener接口,下面是这两个接口的具体定义:,15.2.2 编写Message-Driven Bean,public interface javax.jms.MessageListenerp

25、ublic void onMessage(Message message);public interface javax.ejb.MessageDrivenBean extends EnterpriseBeanpublic void ejbRemove() throws EJBException;public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException;,15.2.2 编写Message-Driven Bean,第一个接口中的onMessage方法的作用和消息监听中的这个方法一样,MDB需

26、要实现这个方法,来告诉容器当消息到来时如何处理消息。,15.2.2 编写Message-Driven Bean,第二个接口首先是从EnterpriseBean接口继承的,所以同时也继承了EnterpriseBean接口的ejbCreate方法。当有些MDB需要发送消息,或者它需要调用receive方法同步的从某个消息队列或主题接受消息,也就是说MDB需要在程序中建立连接、创建会话、发送或接受消息,那么就需要在ejbCreate方法中使用JNDI查找连接对象工厂和目标对象,并建立连接;同时在ejbRemove方法中就需要关闭和释放在ejbCreate方法创建的JMS API连接;另外MDB还需要

27、实现setMessageDrivenContext方法,在这个方法中把Message-Drive Bean和一个MessageDrivenContext对象关联起来,这个MessageDrivenContext对象提供了一些用于管理MDB事务的方法。,15.2.2 编写Message-Driven Bean,当创建Message-Drive Bean实例的时候,EJB容器首先初始化一个MDB实例,然后调用setMessageDrivenContext方法,把一个MessageDrivenContext对象和这个实例关联起来,最后调用ejbCreate方法,这样这个MDB实例就可以开始接受消息了

28、。,15.2.2 编写Message-Driven Bean,Message-Driven Bean的生命周期,15.2.3 MDB与Session Bean的协同工作,Message-Driven只不过是一个消息的使用对象,事实上Message-DrivenBean需要和Session Bean、Entity Bean,Web组件等J2EE元素一起协同完成工作。,15.2.3 MDB与Session Bean的协同工作,这是使用Pub/Sub消息传递机制的JMS&J2EE应用程序,它主要包含一个Publisher Session Bean,这个Bean负责向主题发布消息;还包含一个Messa

29、ge-Driven Bean,它负责接受消息;还有一个客户端向Publisher发送发布消息的指令。 这个例子就好像一个新闻服务提供系统, Publisher Bean把编辑好的新闻分类,然后交给新闻发布系统准备发布;而Message-Driven Bean则好像一个预定了某类新闻的用户,当新闻发布时,MDB会自动挑选那些与用户要求相符的新闻接受。,15.2.3 MDB与Session Bean的协同工作,Session Bean 与 Message-Driven Bean,15.2.3 MDB与Session Bean的协同工作,1. Publisher Session Bean:Publi

30、sherBean 2. Message-Driven Bean:MessageBean 3. 客户端程序:MyAppClient,15.2.3 MDB与Session Bean的协同工作,应用程序的部署和运行:创建消息主题:jms/MyTopic2. 创建连接对象工厂:jms/DurableTopicCF3. 创建J2EE应用程序4. 打包客户端程序5. 打包Publisher Session Bean6. 打包Message-Driven Bean7. 配置Publisher Session的JNDI名8. 部署和运行应用程序 runclient client PubSubApp.ear n

31、ame MyAppClient -textauth,15.2.3 MDB与Session Bean的协同工作,15.2.3 MDB与Session Bean的协同工作,15.2.3 MDB与Session Bean的协同工作,15.2.3 MDB与Session Bean的协同工作,15.2.3 MDB与Session Bean的协同工作,15.2.4 MDB与Entity Bean的协同工作,这个例子包含如下内容: 一个发送和接受消息的客户端,3个Message-Driven Bean和一个由容器管理存储的Entity Bean。 这个例子描述了一个企业的人事部门雇佣新的员工的过程。,15.

32、2.4 MDB与Entity Bean的协同工作,首先客户程序新生成一个雇员ID,然后发布一个包含有雇员ID和雇员姓名的消息到雇员消息主题,并新建一个临时消息队列等待反馈信息;接下来,两个MDB分别给新雇员分配办公室和办公设备,第一个处理消息的MDB新创建一个Entity Bean来保存这些信息,第二个处理消息的MDB找到第一个MDB创建的Entity Bean,并保存相关信息;当两个MDB都完成了工作,并把信息都保存到Entity Bean中以后,Entity Bean向客户端的临时队列对象发送一个反馈信息,并向一个调度消息队列发送包含有Entity Bean的引用的消息,这条消息告诉用于调

33、度的MDB,它的工作已经完成,这个MDB就把Entity Bean删除掉。,15.2.4 MDB与Entity Bean的协同工作,1. 应用程序客户端:HumanResourceClient 2. Message-Driven Bean:ReserveEquipmentMsgBean ReserveOfficeMsgBean 3. SetupOffice Entity Bean:SetupOffice 4.调度的MDB:ScheduleMsgBean,15.2.4 MDB与Entity Bean的协同工作,应用程序的部署和运行:1. 创建消息队列、消息主题:jms/SchduleQueue jms/Topic2. 创建连接对象工厂3. 创建J2EE应用程序4. 打包客户端程序5. 打包分配办公设备的Message-Driven Bean 6. 打包分配办公室的Message-Driven Bean6. 打包用于调度的Message-Driven Bean7. 打包Entity Bean8. Entity Bean的部署设置,15.2.4 MDB与Entity Bean的协同工作,应用程序的部署和运行:9. 部署和运行应用程序 runclient -client NewHireApp.ear -name HumanResourceClient -textauth,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报