IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

IBM WebSphere 开发者技术期刊: 消息中介的实用介绍——第 1 部分

消息中介基础

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

Dan Murphy (d_murphy@uk.ibm.com), 软件工程师, IBM Hursley, UK

2005 年 5 月 01 日

本系列文章阐述了消息中介——IBM® WebSphere® Application Server V6 提供的一个新的功能。第 1 部分介绍了消息中介的基础,主要包括如何开发、部署和测试简单中介。

引言

消息中介是 IBM WebSphere Application Server V6 的新功能之一。中介是 WebSphere Application Server 的消息功能的可编程的扩展,它可以简化那些使用消息传递的连接系统、服务、应用或组件。中介用于处理传递中的消息。可执行的处理中介的类型包括:

  • 修改或传递消息。
  • 将消息(或克隆消息)路由到其它或附加的目的地。
  • 基于中介中一些条件逻辑允许或禁止消息的分发。

WebSphere Application Server V6.0 提供了中介框架执行期环境,它允许您调解消息。IBM Rational® Application Developer(后面简称为 Application Developer)与 WebSphere Application Server Toolkit 都提供了用于中介开发、集成、测试的工具。

本系列文章的第 1 部分解释了消息中介的基础。后面的部分将以这个为基础,并围绕路由消息、有效载荷的简单修改、使用 XSLT 转换消息以及请求/响应消息流程这些方面进行展开。为了按照本文所介绍的方法进行,您需要安装下列软件组合之一:

  • IBM WebSphere Application Server Toolkit 6.0 版本与 WebSphere Application Server V6。
  • IBM Rational Application Developer V6 包括 WebSphere Application Server V6.0 集成测试环境。
  • IBM Rational Application Developer V6 与 WebSphere Application Server V6。

本篇文章中所引用的屏幕截图都来自 Rational Application Developer V6。(本软件的一个试用版本可以下载。)如果您使用的是 WebSphere Application Server Toolkit,那么仍旧可以按照这里说明的步骤进行实施,因为它们不论对于 Application Developer 还是工具包都是一样的。您可以从 WebSphere Application Server installation 光盘或镜像安装 WebSphere Application Server Toolkit。

本文假设您熟悉消息技术(例如 JMS 或 Web services)和基于 Eclipse 的开发工具,并具备使用这些工具开发部署 J2EE 应用的能力。如果您之前使用 WebSphere Studio Application Developer 4 或 5 版本工具来开发 J2EE 应用程序,那么您就已经具备了这些技能。





回页首


为什么要使用中介?

对您来说,当确定中介是否是一个正确的解决方案时,有一些需要考虑的问题。目前,已经可以使用消息驱动 bean(MDB)在不同格式消息间进行转换,那么我们为什么还要使用中介呢?

使用中介最为明显的原因就是它保证了消息的一致性。如果您的 MDB 在您已经处理了它的主体后再次发送该消息,实际上您发送的是一个新的消息。这样操作的结果往往是新消息 ID,与原始消息不一致。这将导致您在关联发送与接收到的消息时产生问题。其它消息属性,例如在发送新消息时,消息的期限或时间表将被重新设置或覆盖。

选择使用中介而不是消息驱动 bean 的另一个原因是中介不与特定的消息技术绑定在一起。当编写一个 MDB 时,您需要根据传递消息的类型实现特定的 Java\u2122 接口。一个处理 JMS 消息的 MDB 将实现 javax.jms.MessageListener 接口。开发基于 Web service 的 MDB 需要实现一些其它的接口,并且需要合适的资源适配器:

  • javax.jms.MessageListener——用于基本的 JMS 消息。当容器调用 onMessage() 时,MDB 传递一个 javax.jms.Message 对象。
  • javax.xml.messaging.OnewayListener——用于单路径的 Web 服务。当容器调用 onMessage() 时,MDB 传递一个 javax.xml.soap.SOAPMessage 对象。
  • javax.xml.messaging.ReqRespListener——用于请求/响应方式的 Web 服务。不同之处在于调用 onMessage() 方法的同时 Web 服务客户端返回一个 SOAPMessage 对象。

当您能开发一个类来实现所有这三个接口时,会以访问、处理实际消息的代码而结束,而这些代码又与许多与技术细节是紧密相关的。然而,中介程序模型提供一个所有消息的服务数据对象(Service Data Object,SDO)接口,以及访问这些不同种类消息属性和元数据的通用 API。

总之,当您需要明显的修改或路由消息时,就需要使用中介来实现。既然同样的中介可以操作 Web 服务或者 JMS 的消息,这里就会产生重用的机会。

您何时可以调节?这时会发生什么?

您能调解入站或出站的服务、队列及主题空间。简而言之,您可以调解在服务集成中的关于任意类型的目标文件。当您调解一个目标文件时,它将被分割成两部分:调解之前与调解之后。中介将从一个目标文件的调解之前部分发送消息。

一旦被处理,假设消息没有改变方向或被消费,消息被放置在调解之后部分。现在,消息允许被传递给一个消息消费者,例如一个服务提供者或是一个 MDB。将目标文件分为调解之前与调解之后两个部分保证了一个调解的地址与一个没有调解的地址具有相同的服务质量。

当中介被应用于一个目标文件时,在消息已经放置到目标后调用它,但这又在从目的地发送或分发之前。





回页首


中介程序模型

中介程序模型基于下列四个接口:

  • com.ibm.websphere.sib.mediation.handler.MediationHandler
  • com.ibm.websphere.sib.mediation.messagecontext.SIMessageContext
  • com.ibm.websphere.sib.SIMessage
  • com.ibm.websphere.sib.mediation.session.SIMediationSession

您的中介处理程序必须实现 MediationHandler 接口。当一个需要被调解的消息抵达后,中介框架将对其调用处理(MessageContext)方法。中介处理程序的一个实例将被重用,这就非常象无状态 EJB。您的中介处理程序在其实例中不会处理状态信息。

当部署中介后,管理员能够选择中介是否支持并发。如果选择支持,框架可以同时在多个实例中使用多线程技术调用 handle() 方法。因此,当您编写一个中介时,您将确认类实例是否是线程安全的。如果您允许消息的并发处理,消息的分发顺序将不被保证。这些就是 J2EE 开发者需要考虑的所有基本问题。

当 handle() 方法被调用时,传递的 javax.xml.rpc.handler.MessageContext 参数实际上是 com.ibm.websphere.sib.mediation.messagecontext.SIMessageContext 的一个实例。该接口允许对消息进行访问,同时提供了其它关于中介细节的操作和属性。

中介处理程序

当消息需要中介时,一个中介处理程序被调用并传递消息上下文。处理程序返回一个布尔类型的值,用于表示是否消息将被继续传递。 在大多数类中,您的中介将返回 true。如果您返回 false,那么消息将不被继续处理和分发,并将被丢弃。例如,您可以使用其作为残缺消息在消费应用或服务收到前进行检查和移除的有效手段。

使用消息上下文您将执行下列操作:

  • 消息有效载荷与消息元数据。
  • 上下文属性(通过配置的键值对来访问)。
  • 使用中介会话的消息服务;例如发送消息到其它目的地。

中介处理程序是实现了 com.ibm.websphere.sib.mediation.handler.MediationHandler 接口的 Java™ 类。这些类装配在企业应用包(EAR)中并被管理员部署。

中介处理程序清单与中介

您通过序列号指派中介处理程序到一个或多个中介处理程序清单。当管理员配置中介时,他们将指定处理程序名字清单。包含在中介处理程序清单中的中介处理程序将被指定的序列调用。这个概念可以参看图 1。


图 1. 概念上的消息中介
图 1. 概念上的消息中介

管理员创建一个中介时需要通过指定它们使用的消息处理程序清单名称。 这样,管理员可以将中介应用到一个或多个目的地。为了实现重用,每个中介处理程序将实现一个指定的任务。您可以在处理程序清单中放置大量的处理程序。这个过程将定义一系列用于每个消息的操作。

中介处理程序组合的一个例子是日志中介处理的使用。当开发、测试其它中介时,您可以使用该中介。日志中介处理程序可被在其它中介之前或之后被调用。通过使用该中介,您可以捕获到消息被其它中介处理程序处理之前与之后的景象。

在多数情况下,每个中介处理程序清单对应一个单独的中介处理程序就可以满足需要了。用于组合中介处理程序到部署组件中的工具提供了简单或高级的处理程序清单配置选项。简单配置选项将自动加入到中介处理程序中作为其自己的中介处理程序清单。





回页首


开发中介处理程序

创建中介处理程序是一个相对简单的工作。中介处理程序实现了中介处理程序接口的简单的 Java 类。为了创建与实现处理程序您将需要执行下列步骤:

  • 创建一个 Java 项目。
  • 将项目绑定到一个 WebSphere Application Server 运行环境。
  • 创建一个实现了 com.ibm.websphere.sib.mediation.handler.MediationHandler 接口的处理程序类。
  • 编写实际用于处理消息的中介代码。
  • 组装中介处理程序到部署工件中(EAR 文件)。
  • 部署中介到一个或多个目的地中。

中介处理程序准备好组装到一个可以部署的工件(EAR文件)中。一旦组装部署后,中介将被应用到一个或多个目的地,在中介目的地上的消息将被中介处理程序处理。

下一章节将分步骤的展示创建一个简单的中介的过程,该中介用于写 WebSphere Application Server 日志信息。您可以使用该中介在您的环境中调试消息流。例如,它可以用于与一个消息驱动 bean 相关,在消息处理前显示消息。

  1. 创建一个中介处理程序项目

    为了放置您的中介,第一步将创建一个合适的项目。您可以创建一个 EJB 或 Java 项目来访问中介框架接口:

    1. 启动 Application Developer。为了练习的目的可以使用默认的工作空间。
    2. 创建一个 Java 项目命名为 MessageMediation
    3. 使用项目上下文菜单选择项目属性。通过右键点击 Java 项目并在其弹出菜单中选择 Project Properties
    4. 选择 Server 属性并设置目标运行时为 WebSphere Application Server v6.0,如图 2 所示。


    图 2. 使用项目属性设置目标运行时
    图 2. 使用项目属性设置目标运行时

    您刚创建的 Java 项目具有访问中介框架接口的能力。与直接在 EJB 项目中开发中介处理程序相比,使用 Java 项目的好处是可以被方便的加入多个企业应用程序或 EJB 项目中。

  2. 创建中介处理程序

    使用新建 Java 类向导创建类 mediation.handlers.DebugMediation,它实现 com.ibm.websphere.sib.mediation.handler.MediationHandler 接口,如图 3 所示。


    图 3. 创建新的 Java 类
    图 3. 创建新的 Java 类

    中介处理程序类的骨架创建好了。编辑类并加入下面的类导入内容:


    清单 1.
    						
    						import java.util.Iterator; import
    						java.util.List; import java.util.logging.Level;
    						import java.util.logging.Logger;
    						import javax.xml.rpc.handler.MessageContext;
    						import com.ibm.websphere.sib.SIMessage; import
    						com.ibm.websphere.sib.mediation.handler.MediationHandler;
    						import
    						com.ibm.websphere.sib.mediation.handler.MessageContextException;
    						import
    						com.ibm.websphere.sib.mediation.messagecontext.SIMessageContext;
    						import
    						com.ibm.websphere.sib.mediation.session.SIMediationSession;
    					

    当您的处理程序需要处理消息时,handle(javax.xml.rpc.handler.MessageContext msgCtx) 方法将被调用。当调用时,类实际来传递一个实现了 com.ibm.websphere.sib.mediation.messagecontext.SIMessageContext 接口(该接口扩展了 javax.xml.rpc.handler.MessageContext 接口)的对象。SIMessageContext 接口允许您访问下面的内容:

    • 上下文属性。
    • 消息与消息元数据。
    • 一个用来访问服务的中介会话。

    将下列代码放入到“public boolean handle(MessageContext arg0) throws MessageContextException”方法中:


    清单 2.
    						
    						boolean continueMsgProcessing = true;
    						SIMessageContext siMsgCtx = (SIMessageContext)
    						msgCtx; if (log.isLoggable(Level.INFO)) {
    						log.info("Context Properties: " +
    						getContextProperties(siMsgCtx));
    						log.info("Message Info: " +
    						getMessageInfo(siMsgCtx.getSIMessage()));
    						log.info("Session Info: " +
    						getSessionInfo(siMsgCtx.getSession())); } return
    						continueMsgProcessing;
    					

    显而易见,该方法所调用的方法还不存在,因此还不能正常被编译。这时,您将编写这些方法的实现并学习 MessageContext 是如何被使用的。在我们转移到中介本身之前,您需要启用 WebSphere Application Server 来记录日志数据。

  3. 使用 java.util.logging 来编写 WebSphere Application Server 日志

    我们需要中介处理程序来记录 WebSphere Application Server 的日志。通过由 JSR 47 定义的标准 Java 日志接口可以轻易的实现,该接口目前已包含在 J2SE 1.4 中。将下列代码加入处理程序类中:


    清单 3.
    						
    						private String loggerName =
    						"MsgMediation"; private Logger log =
    						Logger.getLogger(loggerName); private String
    						className = DebugMediation.class.getName();
    						public String getLoggerName() { return
    						loggerName; }
    						public void setLoggerName(String loggerName) {
    						this.loggerName = loggerName; }
    					

    使用该方法进行日志记录可以使您轻松地开启或关闭 Application Server 的日志。

    正如我们后面即将看到的一样,当类被实例化时,提供 loggerName 的 set 与 get 方法,也允许中介框架设置 loggerName。值的设置将包含在中介处理程序的部署描述符中。同样的技术可以用来提供具有被管理对象引用的中介,例如数据源可以用来通过其它数据来增加消息。

    关于更多在 WebSphere Application Server 组件中使用标准 Java 日志的信息,请参考 WebSphere Application Server Information Center 参考资料中的相关主题。

  4. 使用 SIMessageContext 处理中介上下文属性

    MessageContext 提供了访问上下文属性的方法。这些属性可以在管理员控制台进行设置,因此,中介可以恢复配置和其它可能影响消息处理的属性。

    简单中介处理程序产生一个所有已设置属性的字符串表示法。这通过属性名返回一个格式化的字符串来实现。将下列方法加入到您的中介处理程序类中:


    清单 4.
    						
    						private String
    						getContextProperties(SIMessageContext msgCtx) {
    						StringBuffer data = new StringBuffer(); Iterator
    						i = msgCtx.getPropertyNames(); String propName;
    						while (i.hasNext()) { propName = (String)
    						i.next(); data.append(propName);
    						data.append(" = ");
    						data.append(msgCtx.getProperty(propName)); if
    						(i.hasNext()) data.append(", "); }
    						return data.toString(); }
    					



  5. 访问消息与 SIMessage 接口

    通过传递到您的中介处理程序的 MessageContext,您可以使用中介中的 getMessage() 方法来访问消息。该方法返回 com.ibm.websphere.sib.SIMessage 的实例。您可能会对为什么一些类型的 JMS 消息没有被返回而产生疑问。原因是中介用于许多种类的消息而不仅仅是 JMS 消息。SIMessage 对象被用来描绘许多不同的消息类型, 包括 JMS 与 Web 服务格式。

    SIMessage 接口提供了许多您的中介需要的操作。API 消息 ID 可以被用户应用程序或组件设置。在 JMS 消息情况中,这个将是 JMS 消息 ID。当消息被创建或被入站服务定义接收到时,系统 ID 被消息系统指定。 相关 ID 被用于消息的相关请求和回复。

    消息格式字符串表示了消息发送的原始类型。正如您将在文章后面所看到的,您可以获得与原始消息格式不同的消息有效载荷格式。关于支持格式的清单请参考 WebSphere Application Server Information Center 的 JMSWeb 服务格式的条目。

    消息可以有许多用户属性设置,它们可以是任意序列化的 Java 类。消息也可以具有一个向前的和保留的路由通道。路由通道定义了一个连续的目的地列表,消息将通过其传递到目标地址。

    关于更多 SIMessage 接口的信息请参考 WebSphere Application Server Information Center 的 SIMessage API 条目。

  6. 从 SIMessage 摘录信息

    例子从 SIMessage 获取信息并返回表示消息属性的字符串。

    在中介处理程序中加入下列代码:


    清单 5.
    						
    						private String getMessageInfo(SIMessage message)
    						{ StringBuffer data = new StringBuffer();
    						data.append("API message id = ");
    						data.append(message.getApiMessageId());
    						data.append(", System message id = ");
    						data.append(message.getSystemMessageId());
    						data.append(", Correlation id = ");
    						data.append(message.getCorrelationId());
    						data.append(", Message format =
    						\"");
    						data.append(message.getFormat());
    						data.append('\"');
    						data.append(", Message descriminator =
    						\"");
    						data.append(message.getDiscriminator());
    						data.append('\"'); List list =
    						message.getUserPropertyNames(); if (list != null
    						&& !list.isEmpty()) {
    						data.append(", User properties = ");
    						data.append(list.toString()); } list =
    						message.getForwardRoutingPath(); if (list !=
    						null && !list.isEmpty()) {
    						data.append(", Forward routing path =
    						"); data.append(list.toString()); } list =
    						message.getReverseRoutingPath(); if (list !=
    						null && !list.isEmpty()) {
    						data.append(", Reverse routing path =
    						"); data.append(list.toString()); }
    						data.append(", Reliability = ");
    						data.append(message.getReliability());
    						data.append(", Priority = ");
    						data.append(message.getPriority());
    						data.append(", Redelivered Count = ");
    						data.append(message.getRedeliveredCount());
    						data.append(", User id = ");
    						data.append(message.getUserId()); return
    						data.toString(); }
    					



  7. SIMediationSession 接口

    SIMediationSession 接口定义了用于消息系统查询和互操作的所有方法。例如,它提供了中介在哪里被调用的信息。更多关于会话接口的典型应用是路由消息克隆到其它目的地。

    为了我们中介的目的,我们将从会话对象使用字符串形式来返回信息,以方便日志的写入。在中介处理程序中加入下列代码:


    清单 6.
    						
    						private String getSessionInfo(SIMediationSession
    						session) { StringBuffer data = new
    						StringBuffer(); data.append("Mediation:
    						");
    						data.append(session.getMediationName());
    						data.append(" @ Destination: ");
    						data.append(session.getDestinationName()); if
    						(session.getDiscriminator() != null &&
    						!session.getDiscriminator().equals(""))
    						{ data.append("(discriminator = ");
    						data.append(session.getDiscriminator());
    						data.append(')'); } if
    						(session.getMessageSelector() != null &&
    						!session.getMessageSelector().equals(""))
    						{ data.append(" (message selector =
    						");
    						data.append(session.getMessageSelector());
    						data.append(')'); } data.append("
    						on Bus: ");
    						data.append(session.getBusName());
    						data.append(" in ME: ");
    						data.append(session.getMessagingEngineName());
    						return data.toString(); }
    					

    在大部分情况下,被调用的方法是自解释的。例如 getBusName() 方法用来摘取被部署的中介的名字。虽然不是独自的中介概念,消息鉴别器和消息选择器提供了简要的说明。

消息选择器与鉴别器用于有条件的消息中介:

  • 消息选择器操作消息属性。例如一个排序的系统可以设置顺序值作为消息的属性。中介可以通过确定的值被限制为单独的中介序列。
  • 消息鉴别器用来在主题空间限制消息的主题。这一功能允许您的中介或应用对确定的主题消息进行发布。





回页首


在部署单元中集合中介处理程序

您在安装和配置中介处理程序前,需要将它打包到一个 EAR 文件中。当您已经在一个企业应用程序项目中开发了中介处理中时,如果它是一个 Java 项目,中介将更加具有可重用性。采用这一方式,您可以将中介加入到许多企业应用程序中或开发一个可以被许多项目重用的中介处理程序库。

下一个章节将描述您的中介组装步骤:

  • 创建一个企业应用程序项目,它引用 Java 项目并包含了一个新的 EJB 项目。
  • 设置 EJB 项目 JAR 依赖关系包含 Java 项目。
  • 在EJB部署描述符中定义中介处理程序。

  1. 创建一个企业应用程序项目
    1. 在 Application Developer 中通过选择 File => New => Other 来调用新建向导,正如图 4 所示。
      图 4. 选择新建 EAR 项目向导
      图 4. 选择新建 EAR 项目向导
    2. 选择 Enterprise Application Project 向导,然后选择 Next 按钮。
    3. 命名项目为 DeployableMediation 并按下 Next 按钮。
      图 5. 创建一个新的 EAR 项目
      图 5. 创建一个新的 EAR 项目
    4. 加入存在的 Java 项目并创建一个新的 EJB 模块,如图 6 所示,按下 Finish 按钮。
      图 6. 在 EAR 项目中加入模块
      图 6. 在 EAR 项目中加入模块
  2. 设置 EJB JAR 依赖关系

    打开 EJB 项目属性并选择 Java JAR Dependencies 属性。选择 MessageMediation 项目,如图 7 所示,然后点击 OK 按钮关闭面板。


    图 7. 设置 EJB JAR 依赖关系
    图 7. 设置 EJB JAR 依赖关系
  3. 在 EJB 部署描述符中加入中介处理程序
    1. 打开 EJB 项目并通过双击编辑部署描述符。
    2. 当打开后,选择 Mediation Handler 标签,如图8所示。
      图 8. EJB 部署描述符编辑器中的 Mediation Handler 标签
      图 8. EJB 部署描述符编辑器中的 Mediation Handler 标签
    3. 单击 Add 按钮打开新的面板。
    4. 使用 Browse 按钮选择中介处理程序类。该类对于公布为参数的字段是自省的。我们的中介处理程序字段具有一个适当的默认值,因此您不需要指定一个值除非您要覆盖它。完整的面板如图 9 所示。
      图 9. 定义中介处理程序属性
      图 9. 定义中介处理程序属性
    5. 单击 Finish 按钮。

    默认情况下,中介处理程序的清单名与中介处理程序名一致。在引言中讨论过,通过组装中介处理程序到同一个处理程序列表中来组合中介处理程序是可行的。为了设置一个不同的中介处理程序的清单名,请选择 Advanced 按钮,选择 Define Handler List 并单击 Next 按钮。

此时,完成了 EJB 部署描述符,将其更新以包含新加入的中介处理程序,如图 10 所示。


图 10. EJB 部署描述符更新
图 10. EJB 部署描述符更新

保存并关闭部署描述符后,就可以准备部署中介处理程序了。





回页首


部署及测试中介

部署与测试中介需要一个消息传递总线,同时将消息放入您打算调解的队列中。为了简单起见,已经被提供了脚本来创建简单的总线。在实际世界中,建立一个消息拓扑有许多需要考虑的问题,包括基于何种消息拓扑来创建 WebSphere Application Server。

下面是部署与测试中介的细节步骤:

  • 创建一个消息总线与目的地。
  • 创建 JNDI 资源映射消息资源。
  • 创建一个中介。
  • 对目的地应用中介。
  • 发送消息到一个中介的目的地。
  • 查看 WebSphere Application Server 日志进行验证。

  1. 创建一个消息总线与目的地

    首先,您需要创建一个消息总线,在其上您可以部署简单中介。 为了简化本指南,提供了简单的脚本。您可以通过 wsadmin 命令方式执行该脚本。另外,您可以使用建于 Application Developer 与 WebSphere Application Server Toolkit 中的支持来执行脚本。

    如图 11 所示,您可以使用上下文菜单在定义系统上执行管理脚本。


    图 11. 从 IDE中执行脚本
    图 11. 从 IDE中执行脚本

    (如果您还没有一个定义好的服务器,那么通过使用服务器视图(J2EE 透视图中的一部分)的上下文菜单可以加入一个。)

    导航 createSampleMsgBus.jacl 文件并执行。下面的消息文件被创建:

    • 名为 SimpleBus 的消息总线。
    • 总线成员,服务器实例。
    • 名为 sampleMediationQueue 的队列。
    • 两个 JNDI 引用:
      • jms/CF1,连接工厂用于消息总线的连接。
      • jms/mediatedQueue,与 sampleMediationQueue 总线目的地连接的队列。

    当脚本被执行时,消息将被写入控制台视图。检查这个视图来确认脚本是否被正确的执行。最后一步是保存配置。消息放置到控制台将包含下列内容:


    清单 7.
    						
    						Create messaging bus $AdminTask createSIBus -bus
    						SimpleBus Add server as bus memeber $AdminTask
    						addSIBusMember -bus SimpleBus -node neodogNode01
    						-server server1 -createDefaultDatasource true
    						Create SIB Queues $AdminTask
    						createSIBDestination -bus SimpleBus -name
    						sampleMediationQueue -type queue -node
    						neodogNode01 -server server1 $AdminTask
    						createSIBJMSConnectionFactory -name CF1
    						-jndiName jms/CF1 -busName SimpleBus -type Queue
    						$AdminTask createSIBJMSQueue
    						server1(cells/neodogNode01Cell/nodes/
    						neodogNode01/servers/server1|server.xml#Server_1110560664839)
    						-name sampleMediationQueue -jndiName
    						jms/mediatedQueue -queueName
    						sampleMediationQueue Configuration saved
    					



  2. 创建一个中介
    1. 通过已定义好的服务器的上下文菜单来调用管理员控制台并在提示时登录。
    2. 扩展 Service Integration 标签,选择 Buses ,并按下 SimpleBus 链接。 当页面装载时,将显示包括中介配置在内的总线配置面板,如图 12 所示。
      图 12. 总线配置
      图 12. 总线配置
    3. 选择 Mediations 装载中介配置面板,并选择 New 创建一个新的中介。
    4. 在面板中,输入 DebugMediation 作为中介的名字并以 DebugMediationHandler 作为与该中介绑定的处理程序清单的名称。如果您想设置一个中介上下文属性,那么单击 Apply 按钮而不是 OK 按钮,接下来您就可以设置上下文属性了。完整的新建中介面板如图 13 所示。
      图 13. 创建一个新的中介
      图 13. 创建一个新的中介
    5. 单击 OK 按钮返回中介配置页面。
  3. 应用一个中介
    1. 选择 sampleMediationQueue 目的地并按下 Mediate
    2. 当面板显示后,从下拉列表中选择 DebugMediation 并选择 Next(如图 14 所示)。
      图 14. 选择应用中介
      图 14. 选择应用中介
    3. 选择总线成员(其上可以创建中介点)。在我们所述的情况下,唯一的选择是选择存在的总线成员单击 Next 按钮并单击 Finish 按钮。
    4. 中介一旦被应用,就需要 save 该配置。
  4. 安装中介

    现在,您已经创建和应用了中介,您需要安装实际的中介代码——简单的工作。 使用已定义服务器的上下文菜单来将 DeployableMediation 项目加入服务器并发布它。自从您已经创建了一个消息拓扑与 JNDI 资源,您需要重新启动服务器。使用已定义服务器的上下文菜单或者重启图标来重启它。

  5. 测试中介

    从服务器上下文菜单中调用 Universal Test Client。使用 jms/CF1 连接工厂,导航 Utilities => Send a message 并发送消息到目的地 jms/mediatedQueue

    发送消息将触发中介向 WebSphere Application Server 日志中写入信息。您的输出将与下列内容类似:


    清单 8.
    						
    						[03/03/05 17:15:42:279 GMT] 000000b3
    						MsgMediation I Context Properties: logMessages =
    						true [03/03/05 17:15:42:314 GMT] 000000b3
    						MsgMediation I Message Info: API message id =
    						ID:640788c617cd000bae211cd6110a134f0000000000000001,
    						System message id = A8A19FCBE04A95AA_10000001,
    						Correlation id = null, Message format
    						="JMS:text", Message descriminator =
    						"null", Reliability =
    						ReliablePersistent, Priority = 4, Redelivered
    						Count = 0, User id = [03/03/05 17:15:42:319 GMT]
    						000000b3 MsgMediation I Session Info: Mediation:
    						SampleMediation @ Destination:
    						sampleMediationQueue on Bus: neodogin ME:
    						neodogNode.server1-neodog
    					





回页首


结束语

在该系列文章第一部分中,我们介绍了消息中介的基础,包括什么是中介,为什么使用它们以及何时使用它们。我们也论证如何来编写简单中介处理程序,如何在中介处理程序列表中组装它们,并描述了如何部署中介。

后续的文章将着眼于如何使用 SDO 程序模型来访问消息主体、路由消息,以及其它相关主题。

致谢

向 Dave Vines、Alastair Nottingham 及其他对本文提出建议与反馈的人表示感谢。






回页首


下载

名字大小下载方法
mediatingMessages.zip8 KB  FTP|HTTP
关于下载方法的信息


参考资料



关于作者

作者照片

Dan Murphy 已经在英国的 IBM Hursley 工作 11 年多了,目前,他是 WebSphere 消息的测试设计者与开发者。他喜欢做美味的食物及收集可食用的蘑菇。Dan 非常喜欢圣乔治的每日蘑菇公司。为了防止发胖,他最近重新开始了在 IBM Hursley 俱乐部的武术训练。您可以通过 d_murphy@uk.ibm.com 与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款