消息驱动Bean教案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1章预备知识消息驱动Bean消息驱动Bean是异步的消息消费者,当JMS目的(队列或主题)接收到消息后,EJB容器调用消息驱动Bean。消息驱动Bean没有本地和远程接口。它有一个onMessage方法,当有消息到达时,EJB容器会自动调用该方法。第1章预备知识消息驱动Bean的优势对于客户端而言,消息驱动Bean实现了运行服务器端的业务逻辑,客户端通过向目的发送消息可以访问消息驱动Bean。消息驱动Bean是异步的,消息驱动Bean的实例不保存客户端的状态,但是实例的变量可以保存客户端消息的状态。如果Bean不保存这些状态,这些实例是等同的。消息驱动Bean使得开发异步的处理客户端发送来的消息的EJB变得简单,并且允许通过利用容器管理的消息驱动Bean的实例池处理并发的消息流。第1章预备知识消息驱动Bean与JMS消息消费者类似。不同之处:l消息驱动Bean由WeblogicServerEJB容器管理。服务器通过实现实例池处理并发的消息处理。lJMS消息消费者必须通过在服务器端的会话池中创建MessageListener类实现这一功能。l服务器可以提供安全服务及自动事务管理。消息驱动Bean的最大优势是具有“编写一次,随处配置”的特征l消息驱动Bean配置时仅能指定一个队列或主题lJMS消息消费者可以监听多个队列和主题第1章预备知识MDB和其它EJB的区别:(1)消息驱动Bean和会话Bean和实体Bean的明显区别是:没有本地接口和远程接口,客户端不能直接访问消息驱动Bean,客户端只能通过往消息驱动Bean监听的队列或主题与消息驱动Bean通信。(2)消息驱动Bean类似于无状态会话Bean,是无状态的,但比无状态会话Bean更简单。消息驱动Bean类的实例不保持特定客户程序的会话状态。消息驱动Bean和无状态会话Bean有相同的生命周期,但它没有接口。消息驱动Bean使用一个惟一的事务方法onMessage来处理消息。当消息到达时,EJB容器调用消息驱动Bean的onMessage方法,然后消息驱动Bean检查传入的消息并执行相应的动作,如调用其他的组件。(3)消息驱动Bean不需返回任何数值给它的客户程序,它也不能向客户程序回传异常,因为消息驱动Bean是异步地处理消息的。第1章预备知识消息驱动Bean的生命周期消息驱动Bean的生命周期类似于无状态会话Bean:(1)当EJB容器调用消息驱动Bean类的newInstance方法创建一个实例时,一个消息驱动Bean的生命周期开始了。(2)EJB容器调用setMessageDrivenContext方法(3)调用ejbCreate方法(4)消息驱动Bean准备处理发送到目的(队列或主题)的消息,直到超期。(5)当EJB容器不再需要消息驱动Bean的实例时,EJB容器调用ejbRemoove方法,这会结束消息驱动Bean实例的生命周期。第1章预备知识DoseNotExitReadyOnMessageejbRemove1setMessageDrivenContext2ejbCreate和无状态会话Bean一样,Message-DrivenBean也不会被钝化,只有两种状态:不存在和就绪(可以接收消息)。在生命周期的最后容器调用ejbRemove方法,实例就开始等待垃圾收集器的召唤了。第1章预备知识消息驱动Bean例子该应用程序有两个组成部分(消息驱动Bean没有本地和远程接口):SimpleMessageClient:向消息队列发送消息的J2EE应用程序客户端SimpleMessageEJB:异步接收并处理消息队列中消息的消息驱动Bean客户端发送消息到消息队列,该消息队列是用j2eeadmin命令创建的。JMS服务提供者(这里是J2EE服务器)将消息传送给消息驱动Bean实例处理。第1章预备知识(一)J2EE应用程序客户端SimpleMessageClient客户端程序发送消息到SimpleMessageBean监听的消息队列。A:首先它找到连接工厂和消息队列:queueConnectionFactory=(QueueConnectionFactory)jndiContext.lookup(java:comp/env/jms/MyQueueConnectionFactory);queue=(Queue)jndiContext.lookup(java:comp/env/jms/QueueName);第1章预备知识B:然后创建到消息队列的连接、消息会话和消息发送器:queueConnection=queueConnectionFactory.createQueueConnection();queueSession=queueConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);queueSender=queueSession.createSender(queue);第1章预备知识C:最后发送几条消息到消息队列:message=queueSession.createTextMessage();for(inti=0;iNUM_MSGS;i++){message.setText(Thisismessage+(i+1));System.out.println(Sendingmessage:+message.getText());queueSender.send(message);}第1章预备知识(二)消息驱动Bean类消息驱动Bean类的要求:实现MessageDrivenBean和MessageListener接口定义为公有(public)类不能定义成abstract和final类实现onMessage方法实现ejbCreate和ejbRemove方法必须有一个无参构造函数不能定义finalize方法和会话Bean和实体Bean不同,消息驱动Bean没有本地接口和远程接口。客户端不必查找消息驱动Bean的实例,并在这些接口上调用方法。虽然消息驱动Bean也没有商业方法,但是它可以有辅助类并在onMessage方法例调用这些辅助类的方法。第1章预备知识OnMessage方法当消息队列收到一条消息,EJB容器调用消息驱动Bean的onMessage方法。在SimpleMessageBean类中,onMessage方法将接收到的消息恢复造型为TextMessage消息并显示消息内容:publicvoidonMessage(MessageinMessage){TextMessagemsg=null;try{if(inMessageinstanceofTextMessage){msg=(TextMessage)inMessage;System.out.println(MESSAGEBEAN:Messagereceived:+msg.getText());}else{System.out.println(Messageofwrongtype:+inMessage.getClass().getName());}第1章预备知识ejbCreate和ejbRemove方法必须是公有(public)方法返回类型是void不能是abstract和final方法不能有throws子句没有参数本例SimpleMessageBean类中ejbCreate和ejbRemove方法都是空方法。第1章预备知识运行本例子启动J2EE服务器j2ee–verbose创建消息队列1.创建:j2eeadmin-addJmsDestinationjms/MyQueuequeue2.确认消息队列已经创建:j2eeadmin-listJmsDestination第1章预备知识部署该程序(SimleMessageApp.ear)指定Bean类型和事务管理机制Bean向导,创建消息驱动Bean(类文件加入都一样)1.在General对话框中,选中Message-Dirven单选按钮2.在TransactionManagement对话框指定事务管理机制。可以是容器管理(Container-Managed)和Bean管理(Bean-Managed)中的任意一个。不过选择Bean管理的事务时,指定应答(Acknowledgement)类型。第1章预备知识第1章预备知识设置消息驱动Bean的特有属性1.上面提到的新建企业Bean向导的第4步2.消息驱动Bean的Message选项页(如图7-2)1.DesinationType通过两个单选按钮Queue(消息队列)和Topic(消息主题)来设置。消息队列使用点对点消息域,它只能有一个消息消费者。消息主题使用发布-订阅消息域,它可以有0个或多个消息消费者。第1章预备知识第1章预备知识2.在Destination下拉框中选择你用j2eeadmin命令创建的消息的JNDI名。目的地(destination)可以是Queue和Topic中的任意类型,它是消息转发服务的提供者(itrepresentsthesourceofincomingmessagesandthetargetofoutgoingmessages)3.ConnectionFactory下拉框,在QueueConnectionFactory和TopicConnectionFactory中选择合适的一个(其实这两个工厂在选择DesinationType就被过滤了一个了)。它们提供J2EE组件访问消息服务的连接。4.如果你设置的是Bean管理的事务,那么你要选择应答(Acknowledgment)类型:Auto-Acknowledge或者Duplicates-OK。Auto-Acknowledge指示会话自动应答消息驱动Bean消费了消息。Duplicates-OK指示会话不必确保对发送消息的应答(TheDuplicates-OKtypeinstructsthesessiontolazilyacknowledgethedeliveryofmessages),它可能引起消息重复,但是降低了会话费用。第1章预备知识配置JMS客户端配置资源引用1.在树视图中选中客户端节点2.选择ResourceRefs选项页3.点击Add按钮4.在CodedName列输入和客户端调用lookup方法时用的参数对应的名字(当然你也可以在这里先设置了之后,再写客户端的lookup调用)。如本例客户端lookup方法调用的参数是java:comp/env/jms/MyQueueConnectionFactory,则CodedName应该是:jms/MyQueueConnectionFactory5.在Type列选择和消息目的地(destination)类型一致的连接工厂类第1章预备知识6.在Authentication列,大部分时候你应该选择Container。如果在程序中编码登录消息服务,你可以选择Application。7.在Sharable列中,确信复选框被选中。这样可以让容器优化连接。8.在UserName和Password域输入用户名和密码。J2EESDK的验证服务将在客户端运行时提示你输入用户名和密码。第1章预备知识第1章预备知识配置资源环境引用1.选择ResourceEnv.Refs选项页2.点击Add按钮3.在CodedName列输入和调用lookup方法定位消息队列或者消息主题时的参数一致的名字。本例中lookup方法调用的参数为:java:comp/env/jms/QueueName,对应的CodedName为:jms/QueueName4.在Type列选择和目的地类型一致的类型(一般工具会自动选择一个正确的类型)第1章预备知识第1章预备知识设置JNDI名1.在树视图中选择应用程序节点2.选择JNDIName选项页,设置用到资源的正确JNDI名。表7-1列出了本例中使用的JNDI:第1章预备知识第1章预备知识setAPPCPATH=D:\test2\examp

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功