以连接器为基础的消息驱动Bean

虽然以JMS 为基础的MDB 已经证明非常有用, 它也有限制.也许最大的限制就
是EJB提供商支持仅一个或少数的JMS提供者(通常只有一个).在前面的EJB2.1
中,大多数厂商只支持他们自己的JMS提供者,并且没有其它的.显然,这样的限制
是你的选择:如果你的公司或公司的一部分使用一个JMS提供者,它不被EJB提供
商支持,你将不能够处理JMS提供者传递过来的消息.
[*]绕过这个JMS通道,消息的路由从一个JMS提供者到另一个,这是一个EJB规范
外的一个习惯上的解决方法.
问题的本质是复杂的并且要求对事务管理有一个深入的理解.简言之,对于MDB,
消息被JMS提供者传递到MDB,并且所有的工作由MDB执行(例如,使用JDBC,调用其
他Bean上的方法,等等),必需是同一事务的一部分,被EJB容器初始化.这需要
EJB 容器事前知道信息递送即将来临以便在信息实际上被递送之前,它能开始处
理. 不幸地, JMS API 不支援这种功能.因此在早期的EJB 中, JMS 提供者必
须执行和每个EJB 厂商的订制整合.整合的花费是昂贵的(业务),所有旧的
EJB2.0厂商一般选择少许的集成JMS提供者.
另一个JMS为基础的MDB限制是JMS程序模型的限制;没有其它的消息系统支持.
虽然JMS是非常有用的,不过它不是唯一可用的消息系统.SOAP,Email,CORBA消息,
用于ERP系统中的所有消息系统(SAP,PeopleSoft,等等),遗留下来的消息系统,
如其它的非JMS消息系统.
EJB 3.0(和2.1) 支持扩展,更多公开定义的消息驱动Bean,允许他们服务任何
种类的消息系统从任何厂商.唯一的要求是新类型的消息驱动Bean上附着消息驱
动Bean的生命周期.EJB 厂商能建立代码来支持新的消息系统(一些其它的JMS),
但是,他们必需也一定支持任何以JCA 1.5为基础的消息驱动Bean.
JCA提供一个标准的服务器提供接口(SPI)允许任何的IES插入到J2EE容器系统.
连接器结构的1.0版本仅仅应用在请求/响应资源,J2EE组件(EJB或servlet/Jsp)
初始化请求.当前版本为1.5,要求j2EE1.4或更高,更加全面并且可以开作在任意
的异步消息系统中. 在这倦的系统中,J2EE组件等候消息的到达,代替初始化交
互同EIS;EIS的初始化将互通过消息的分离.
JCA1.5明确定义一个消息的契约同消息驱动Bean的连接.它定义一个EJB容器和
一个异步连接,所以消息驱动Bean可以自动处理来自EIS的信息.MDB以一个异步
连接为基础,实现一个指定的消息接口的定义通过连接器自身.代替实现
javax.jms.MessageListener接口.MDB实现一些其它类型的接口指定到EIS.例如,
第三章中介绍的一个假设的邮件连接,允许MDB处理类似的以JMS为基础的JMS消
息.电子邮件连接器从厂商X 购买和传递一个JAR文件被叫做资源档案
(RAR).RAR 包含所有的连接代码和必需的部署描述符植入到EJB 容器系统.
它也定义了开发者使用的用于创建一个电子邮件的MDB所需的接口.这是一个假
设的电子邮件消息接口,他必需实现一个电子邮件的MDB:
package com.vendorx.email;
public interface EmailListener
{
public void onMessage(javax.mail.Message message);
}
Bean类实现这个接口,负责处理电子邮件连接器递送的消息.下面的代码显示了
一个MDB实现EmailListener 接口和处理电子邮件:
package com.titan.email;
@MessageDriven(activationConfig={
@ActivationConfigProperty(
propertyName="mailServer",
propertyValue="mail.ispx.com"),
@ActivationConfigProperty(
propertyName="serverType",
propertyValue="POP3 "),
@ActivationConfigProperty(
propertyName="messageFilter",
propertyValue="to='submit@titan.com'")})
public class EmailBean implements com.vendorx.email.EmailListener {
public void onMessage(javax.mail.Message message){
javax.mail.internet.MimeMessage msg =
(javax.mail.internet.MimeMessage) message;
Address [] addresses = msg.getFrom( );
// continue processing Email message
}
}
在这个例子中,容器调用onMessage()传递一个JavaMail Message对象,那个代表
一个email消息包含MIME附件.然而,消息接口通过使用连接器为基础的MDB没有
使用onMessage().方法名和方法签名可以是适当的EIS;它甚至可以有返回类型.
例如,一个连接器可以为SOAP开发处理请求/应答形式的消息.这个连接器可以使
用ReqRespListener定义通过XML消息的Java API.SOAP消息API由sun制定,它不
是J2EE平台的一部分:
package javax.xml.messaging;
import javax.xml.soap.SOAPMessage;
public interface ReqRespListener {
public SOAPMessage onMessage(SOAPMessage message);
}
在这个接口中,onMessage()有一个SOAPMessage类型的返回值.这意谓EJB 容器
和连接器负责把应答信息协调回到寄件人. (或者到一些部署描述符中定义的目
的地).除了支持不同的方法信号外,消息接可能存在多个方法为处理不同种类的
消息使用相同的MDB.新的消息驱动Bean无限制的被EJB容器系统支持.真正美好
的是以连接器为基础的MDB完成的跨跃多个EJB厂商,因为所有的提供商必需支持
他们.如果以使用连接器为基础的MDB同提供商A和过后你想改变提供商为B,你可
以继续使用相同的连接器为基础的MDB,不会出现问题.
活动配置属性使用非JMS为基础的MDB依赖连接器类型和它的请求.让我们看一个
例子:
@MessageDriven(activationConfig={
@ActivationConfigProperty(
propertyName="mailServer",
propertyValue="mail.ispx.com"),
@ActivationConfigProperty(
propertyName="serverType",
propertyValue="POP3"),
@ActivationConfigProperty(
propertyName="messageFilter",
propertyValue="to='submit@titan.com'")})
我们在前面谈论过的@ActivationConfigProperty.如同你看到的前面的例子,任
何name/value对被这个元数据支持,因此,它可以很容易的支持邮件指定的配置
为这种连接器类型.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值