在WebSphere中使用激活规范来联合MQ与MDB

来源:互联网 发布:r语言 金融数据 pdf 编辑:程序博客网 时间:2024/06/05 01:56

      在MQ中,我们可以实现将不同的终端同时连接到queue或topic中,作用不言而喻,众多的实现让JMS大行其道。

             图 1. 使用 WebSphere MQ 在不同的系统之间进行通信

      在WebSphere中,除了连接工厂、目的地、监听端口等直接和MQ通信的配置环境外,被广泛使用的是激活规范,激活规范出现在Websphere V6中。

激活规范介绍

WebSphere  消息传递提供程序支持基于 J2EE™ Connector Architecture (JCA) 1.5 兼容资源适配器。JCA 1.5 规范的一部分定义独立于供应商的方法,此方法可以将入站消息提交到在 Java EE 兼容应用服务器(如 WebSphere Application Server)中运行的消息驱动的 Bean (MDB)。用于配置和设置入站消息交付的构造称为激活规范。因此,在 WebSphere Application Server V7 中,现在可以创建 MQ 消息传递提供程序激活规范来管理在 WebSphere Application Server 中运行的 MDB 与 WebSphere MQ 中的目的地之间的关系。

MQ 消息传递提供程序激活规范现在是将消息从 WebSphere MQ 目的地提交到在 WebSphere Application Server 中运行的 MDB 的首选机制。激活规范取代了现有 WebSphere Application Server 消息侦听器端口支持的使用,该侦听器端口支持在 WebSphere Application Server V7 中就已经弃用。不过,仍可以使用消息侦听器端口通过 MQ 消息传递提供程序将消息提交到 MDB——甚至可以同时配置使用 MQ 消息传递提供程序资源的消息侦听器端口和 MQ 消息传递提供程序激活规范。

运行中的激活规范

图 3 显示了如何使用 MQ 消息传递提供程序激活规范将 WebSphere MQ 队列管理器目的地链接到在 WebSphere Application Server 中运行的 MDB。通过 MQ 消息传递提供程序激活规范将消息从客户端提交到 MDB 的流程采取以下方式:

  1. 在独立流程中运行或在应用服务器环境中运行的消息传递客户端使用 JMS(或任何其他消息传递 API,如 MQI)将消息发送到在 WebSphere MQ 队列管理器中定义的 WebSphere MQ 队列或主题。
  2. 将 WebSphere MQ 激活规范配置为在该目的地上侦听消息。检测到新消息时,将从该目的地(可能位于 XA 事务下)将其删除。
  3. 然后,通过 onMessage 方法将该消息传递到已配置为使用 MQ 消息传递提供程序激活规范的 MDB。
  4. MDB 使用该消息中的信息执行相关的业务逻辑。

图 3. 运行中的 WebSphere MQ 消息传递提供程序激活规范
图 3. 运行中的 WebSphere MQ 消息传递提供程序激活规范 

配置激活规范

配置 MQ 消息传递提供程序激活规范非常类似于配置 MQ 消息传递提供程序连接工厂。可以使用 WebSphere Application Server 管理控制台或 wsadmin 命令行工具对它们进行配置。要使用管理控制台创建 MQ 消息传递提供程序激活规范,请执行以下操作:

  1. 登录到管理控制台。
  2. 导航至 Resources 部分。展开 JMS 选项卡,并单击 Activation specifications
  3. 选择定义 MQ 消息传递提供程序激活规范所需的范围。
  4. 单击 New
  5. 单击 WebSphere MQ messaging provider 框,并单击 OK

图 4 对这些关键控件的位置进行了批注。


图 4. 配置激活规范
图 4. 配置激活规范 

创建了基本 MQ 消息传递提供程序激活规范之后,可以使用六种不同的配置面板进一步对其进行配置。要进一步配置 MQ 消息传递提供程序激活规范,请执行以下操作:

  1. 登录到管理控制台。
  2. 导航至 Resources 部分,展开 JMS 选项卡,然后单击 Activation specifications
  3. 选择定义相关 WebSphere MQ 消息传递提供程序激活规范的范围。
  4. 选择相关的 MQ 消息传递提供程序激活规范。

第一个面板可用于修改 MQ 消息传递提供程序激活规范的传输模式和目的地,以及其他常用的配置设置。此页面的右侧提供指向其他配置面板的链接:

  • 使用 Advanced properties 面板可以配置消息压缩、使用者设置和消息格式设置。使用该面板还能够设置 MQ 消息传递提供程序激活规范尝试向 MDB 提交消息的次数(如果 MDB 重复抛出异常)。如果超过提交次数,并且正确地配置了激活规范,则失败的 MDB 会暂停,从而提供调查故障的机会。
  • 可以使用 Broker properties 面板配置用于执行发布/订阅消息传递的设置。并非所有属性都适合于所有版本的队列管理器。在 WebSphere MQ 信息中心指定了有关哪些属性适用于特定版本的队列管理器的更多信息。
  • 可以使用 Custom properties 面板以名称-值对的形式为 MQ 消息传递提供程序激活规范输入任何常规配置设置。通常,此信息并不是必需的。
  • 使用 Client transport properties 面板可以输入关于 SSL 设置和通道出口的其他信息。如果已创建基于客户端通道定义表 (CCDT) 的 MQ 消息传递提供程序激活规范,则此页面不可用。
  • 最后,可以使用 JAAS-J2C authentication data 面板创建身份验证别名,以供 MQ 消息传递提供程序激活规范使用。
使用激活规范

我们利用刚刚的方法创建了一个激活规范 :

名称: PersistenceAS   

JNDI 名称:eis/PersistenceAS   

 提供程序:Default messaging provider   

作用域:节点=PremisesNode,服务器=server1

      

       定义好后,在Rational中新建的MDB配置描述符,双击Deployment Descriptor:TemperatureEvent_EJB



会弹出editor,在editor中选择Enterprise JavaBeans:


点击:TemperatureEventTaskAgent

会弹出对这个bean的配置:



在配置中,我们指定了JCA Adapter的位置,上面的一系列的设置就是为了让EJB得到 SIbus IBMSensorEvents的数据:

ibmse LIKE '%/temperature/event' OR ibmse='RfidInventory/TagReport' OR ibmse='RfidInventory/TagAggregationReport' OR ibmse LIKE '%/report/TagReport' OR ibmse LIKE '%/report/TagAggregationReport'

最终,我们能够实现的就是:

EJB中的onMessage方法得到运行。这样看上去将一个问题搞的复杂了。但是,随着系统的复杂,业务之间的集成,这样的架构能保证速度和开发成本。

package com.temperature.event.mdb;import com.ibm.sensorevent.model.IPayloadMetaData;import com.ibm.sensorevent.model.ISensorEvent;import com.temperature.event.payload.TemperatureEventPayload;public class TemperatureEventTaskAgentBean extends com.ibm.sensorevent.engine.baseagent.IBMSEAbstractTaskAgentimplements javax.ejb.MessageDrivenBean, javax.jms.MessageListener {private static final long serialVersionUID = 1L;private javax.ejb.MessageDrivenContext fMessageDrivenCtx;// Method 1protected void onIBMSensorEvent(ISensorEvent event) {try {// display the event dataTemperatureEventPayload payload = (TemperatureEventPayload) event.getPayload();int temperature = payload.getTemperature();long time = payload.getTime();System.out.println("task agent: temperature = " + temperature);System.out.println("task agent: time = " + time);// add sample data to event metadataIPayloadMetaData metadata = event.getPayloadMetaData();metadata.addBooleanAttribute("processed", true);// forward event to output channelsthis.publishOutbound(event);} catch (Exception e) {e.printStackTrace();}}// Method 2public void onMessage(javax.jms.Message msg) {super.onMessage(msg);}public javax.ejb.MessageDrivenContext getMessageDrivenContext() {return fMessageDrivenCtx;}public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx) {fMessageDrivenCtx = ctx;}public void ejbCreate() {}public void ejbRemove() {}}




原创粉丝点击