分享
 
 
 

使用消息驱动Beans(2)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

例子程序介绍

我们的Email应用程序将使用PTP域模型。当一个eamil被放入队列中时我们只希望一个接收者能够收到,另外email可以被多次发送。

JMS 消息被放入队列的条目是JMS消息。这是一个普通的消息,他拥有消息头和消息体。JMS消息有如下几个类型:

类型描述

TextMessage文本消息. 你可以通过msg.setText("foo")和msg.getText方法来操作TextMessageObjectMessage

这种消息存储序列化对象。你可以通过msg.setObject(Object o)和msg.getObject()来操作ObjectMessage.MapMessage

这种消息保存键/值对信息。你可以通过msg.setString(key,value)和msg.getString(key)来操作MapMessage.他还有其他几种getter和setter方法对应基本java类型(比如,getBoolean,getInt,getObject,等等)BytesMessage这种消息是一个字节流。他可被用于封装现有的消息格式。StreamMessage这种消息允许你发送java的原语流。在我们的例子中将使用一个MapMessage,因为他提供了一种方法可以让我们把email的标题信息和内容信息放到消息中。EJB 2.0消息驱动Bean我们已经讲述了JMS的基本概念,现在我们来谈一谈EJB2.0规范中的新概念。

回顾一下前面讲的JMS部分。我们有一个发送者,他把消息放到队列中,然后一个接收者将读取这个消息并使用接收到的信息来发送email。这个接收者可以是一个运行的程序,他接收“Email队列”中的消息。为了实现这个动作我们需要一个接收者,这个接收者的结构允许一个消息流的并行处理,同时它还要处理事务,这将使我们能够处理商业逻辑。这就是消息Bean的由来。也就是说一个消息Bean是一个简单的JMS消费者。一个客户端不能直接访问消息Beans(像你访问状态Bean那样)你只能通过发送JMS消息到消息Bean所侦听的目的地。为了达到重用的目的,像其他的EJB一样,许多的支持信息都在EJB部署描述符中。这意味着我们不必关心我们从那里获得消息(不管是一个queue或者是topic),我们只需要写一个OnMessage(Message msg)方法来处理消息就可以了。我们已经讲述了JMS和MDB的知识;现在让我们开始我们的例子吧.Email 应用程序的开发步骤:我们将通过下面几步来完成email应用程序:在JMS服务器上安装一个“Email Queue”消息队列。创建一个email客户端,他负责向emial 队列发送java 消息。创建一个消息驱动Bean,他将处理这些消息,然后用这些信息用Email发送。为消息驱动Bean写部署描述符。打包代码。

将被创建的代码是:

代码

描述

com.customware.client.EmailClientemail客户端,他将把消息发送到队列中com.customware.ejb.EmailMDB消息驱动Bean将消耗来自客户端的JMS消息,并且使用EmailHelper来发送邮件。com.customware.util.EmailHelper一个助手类,他有一个静态方法sendmail(Map mail,这个方法将使用JavaMail发送邮件。

第一步:安装一个邮件消息队列

这一步将依赖于你的消息服务器(比如IBM MQSeries,SonicMQ,等等)。我们需要安装一个JMS 队列。我给他取名为EmailQueue,客户端和消息驱动Bean部署描述符要用到它。

第二步:创建一个Email客户端 (EmailClient.java)现在我们需要创建一个客户端(JMS sender)。这个客户端截获搜有关email的信息,然后把它发送出去。main()方法从命令行获得参数,创建一个Hashtable(用于存储Map),调用sendmail(Map m)方法。sendmail方法获得信息,根据获得的信息中创建一个MapMessage,再通过sender.send(message)把消息发送到EmailQueue队列中。主要的工作在构造函数之中,这些是JMS工作的全部内容。

下面是构造函数的内容:

1.通过getInitialContext()助手方法连接到JNDI服务。

2.为队列查找一个连接工厂[(QueueConnectionFactory) ctx.lookup(CONNECTION_FACTORY)]

3.为我们的JMS服务器创建一个队列连接[conFactory.createQueueConnection()]

4.创建一个JMS会话(session),这个会话用于生产和消费信息。[connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE)]5.查找队列,他将发送消息[(Queue) ctx.lookup(QUEUE_NAME)]6.最后创建一个发送者,这个发送者将使用会话(我们前面创建的)发送消息到我们查找到的队列中。

第三步:创建一个消息Bean (EmailMDB.java)在写会话 Bean或实体Bean时,你必须创建远程接口、主接口和Bean类(实体Bean还有一个可选的主键类)。而消息Bean只需要Bean类,因为有一个“客户端”他将作为Bean的接口。一个消息驱动Bean必须扩展两个接口:

接口描述

MessageListener

javax.jms.MessageListener这是JMS接口,他提供了一个onMessage(Message msg)方法。当一个消息放入队列中时,消息驱动Bean的onMessage方法将被调用,容器将传输实际的消息来被消费。MessageDrivenBean

javax.ejb.MessageDrivenBean这是EJB接口,他包含EJB生命周期的方法:ejbCreate(): 当EJB创建时容器会调用这个方法ejbRemove(): 当容器销毁EJB时调用setMessageDrivenContext(MessageDrivenContext ctx): 当对象被装载后ejbCreate()调用之前上下文环境被传输到EJB中. 上下文包含信息,容器保存这些信息并允许你查许、处理(getUserTransaction(), setRollbackOnly(), getRollbackOnly())

security (getCallerPrincipal(), isCallerInRole())

如果你看一下EmailMDB.java代码你会发现开头的几个方法实现了MessageDrivenBean接口。我们在这些方法中作的所有事情就是打印他们被调用的信息。setMessageDrivenContext()把上下文环境保存到实例变量中,以便我们今后能够找的到他。你要作的差不多就是这些了。最后要作的就是扩展MessageListener接口的onMessage(Message msg)方法。这就是我们消费消息并处理他们的过程。开始,我们通过抛出的消息创建一个MapMessage。然后我们从map消息中查找“键/”值对,把他们的值装入标准的Hashtable。注意,这些方法我们是通过MapMessage调用的:// 从Map Message获得键

Enumeration mapnames = mapmessage.getMapNames();

// 从MapMessage中获得值

String val = mapmessage.getString(key);

最后,调用 EmailHelper.sendmail(map)方法,把消息当作邮件发送出去。是不是很简单。这就是是消息驱动Bean重要的部分,我们没有写那些晦涩的JMS代码。实际上消息驱动Bean是如何知道从那里获得这些消息?这些我们是通过部署描述符来实现的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有