深入剖析SCA异步调用模式(一)

日期: 2008-10-28 作者:Yu ZhangXiao Li Yu 来源:TechTarget中国 英文

  服务组件体系结构(Service Component Architecture,SCA)是下一代编程模型,此编程模型提供了三种异步调用模式。您可以使用那些模式异步地调用目标SCA服务,而不需要知道请求和响应消息是如何“魔法般地”进行处理的。本文阐述在发出异步请求时所发生的情况,以及SCA运行时如何处理消息系统中的异步消息。了解如何开发中介处理程序来监视SCA异步消息,以及如何使用中介处理程序来分析异步调用。

  引言

  IBM WebSphere Integration Developer和IBM WebSphere Process Server是用于组装和执行SCA应用程序的功能强大的平台。SCA的一个重要特性在于,它与传输协议无关,这意味着业务应用程序开发人员可以集中精力处理业务逻辑。作为开发人员,您唯一需要知道的事情在于,您能够以同步或异步的方式向服务发送请求,而不需要知道请求消息是如何进行处理的。服务也决不需要知道请求来自于何处。请求可能来自于Java Message Service(JMS)队列、HTTP请求,或者甚至来自于套接字请求。所有这些传输信息对服务提供者和请求者是完全透明的。

  但是系统架构师、服务维护团队和技术专家需要知道幕后发生的事情。本文将阐述那些过程。

  图1所示的拓扑可以帮助您发现SCA运行时异步行为。该拓扑包括两个模块:Caller和Callee。Caller模块包含两个实现类型为Java的SCA组件。第一个Java组件(Caller)异步地调用同一个模块或另一个模块中的Callee组件。最终用户确定该调用是否以跨模块的方式发生,以及所使用的是哪一种调用类型。

  图1. 示例拓扑
 
  在WebSphere Integration Developer中构建Caller和Callee模块以后,WebSphere Integration Developer将为每个模块生成相关的Java 2 Platform, Enterprise Edition(J2EE)构件。这些构件是了解SCA运行时行为的关键。例如,对于Caller模块,您将获取如图2所示的构件。

  图2. WebSphere Integration Developer中的Caller模块的构件
 
  在将应用程序部署到WebSphere Process Server以后,您可以在SCA系统总线中看到以下目的地已自动地生成(请参见图3)。

  图3. SCA系统总线中的目的地
 
  WebSphere Integration Developer生成的构件和应用程序部署期间生成的目的地一起来完成同步和异步调用。

  WebSphere Integration Developer为每个模块生成一个Enterprise JavaBeans(EJB)项目。在所生成的EJB项目中,WebSphere Integration Developer为该模块生成一个会话Bean,用于为服务请求者提供同步调用接口。所生成的另一个重要构件是消息驱动Bean(message-driven bean,MDB),用于处理所有的异步请求。MDB从JMS消息正文获取请求消息,并从消息标头中获取目标服务名称。然后它将请求分派给某个SCA运行时。SCA运行时处理消息并调用目标服务。如果存在任何响应,SCA运行时将响应消息写回到JMS目的地中。最后,MDB再次拾取响应消息,将消息分派给SCA运行时,并让SCA运行时将消息发送给调用者。

  一般来讲,那些目的地和MDB是SCA异步处理的关键。当SCA检测到存在异步请求(调用方法为async_XXX)时,它将请求放入预定义的目的地中。MDB将被触发,并从消息正文获取消息,从消息标头获取目标服务名称。然后它将请求分派给SCA运行时,后者处理消息,调用目标服务,如果存在任何响应,则将响应消息写回到JMS目的地中。最后,MDB再次拾取响应消息,将消息分派给SCA运行时,后者然后将消息发送给调用者。

  因此,关键是了解这些目的地如何协同工作以完成异步调用。以下几个部分将解释所有的详细信息。

  消息中介处理程序

  前一部分向您介绍了SCA异步处理机制。务必要知道那些目的地如何协同工作以完成异步调用。下面您将了解如何利用消息中介处理程序功能来揭开秘密。

  IBM WebSphere Application Server V6.1信息中心将中介处理程序定义为“充当中介中的部署和管理单元的Java程序。它具有控制其行为的中介参数。”

  如图4所示,预配置的中介处理程序在消息到达目的地之前被触发。中介处理程序可以:

  ·将消息从一种格式转换到另一种格式。
  ·将消息路由到一个或多个不是由发送应用程序指定的目标目的地。
  ·通过添加来自数据源的数据来扩充消息。

  图4. 中介处理程序
 
  本文中的方法是使用中介处理程序来监视所有的SCA目的地,并获取消息路由路径。然后您就可以明白SCA运行时是如何工作的。

  首先您将开发一个中介处理程序:

  ·在WebSphere Integration Developer中创建一个EJB项目,然后创建一个Java类,该类实现一个MediationHandler接口。清单1显示了当前的目的地名称。有关开发自定义中介处理程序的完整描述,请参考IBM WebSphere Application Server V6.1信息中心。

  清单1. 中介处理程序实现
  public class SCAMessageHandler implements MediationHandler {
   public boolean handle(MessageContext context) throws MessageContextException {
    try {
     SIMessageContext ctx =(SIMessageContext)context;
     System.out.println(“=====>destination name:” +
       ctx.getSession().getDestinationName());
    } 
    catch(Exception e) {
      e.printStackTrace();
    }
    return true;
  }
 
  ·打开此EJB项目的部署描述符(Deployment Descriptor,DD),并将该类添加到中介处理程序列表。如图5所示,务必要记住的关键信息是中介处理程序名称,在将应用程序部署到WebSphere Process Server以后将会使用到该名称。

  图5. 定义中介处理程序
 
  ·完成向导之后,DD源文件中将为该处理程序生成一个会话Bean,如清单2所示。

  清单2. 示例DD源文件
  <session id=”SCAMessageHandler”>
   <ejb-name>SCAMessageHandler</ejb-name>
   <local-home>com.ibm.websphere.sib.mediation.handler.ejb.
     GenericEJBMediationHandlerLocalHome</local-home>
   <local>com.ibm.websphere.sib.mediation.handler.ejb.
     GenericEJBMediationHandlerLocal</local>
   <ejb-class>com.ibm.websphere.sib.mediation.handler.ejb.
     GenericEJBMediationHandlerBean</ejb-class>
   <session-type>Stateless</session-type>
   <transaction-type>Container</transaction-type>
   <env-entry>
    <env-entry-name>mediation/MediationHandlerClass</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>test.SCAMessageHandler</env-entry-value>
   </env-entry>
  </session>
 
  ·在EAR文件中公开该EJB项目,并将其部署到WebSphere Process Server。

  ·在将中介处理程序应用程序和两个SCA示例应用程序部署到WebSphere Process Server以后,登录到集成的解决方案控制台,以创建中介并在SCA系统目的地上中转该中介。

  ·导航到Service Integration>Buses>SCA.SYSTEM.您的单元名称>Bus>Mediations>New。

  ·在Handler list name字段中输入SCAMessageHandler(请参见图6)。

  图6. 创建中介
 
  ·现在您需要在为Caller和Callee模块创建的所有目的地上中转该中介处理程序。可以将该中介中转到所选的目的地,如图7所示。

  ·保存更改,然后对所有的目的地重复上述步骤。

  图7. 中转目的地
 
  注意:如果存在许多需要中转的目的地,逐个地中转它们是非常耗时的。一种方法是编写脚本来自动化该过程。您可以使用清单3中的代码将中介处理程序中转到总线中的所有目的地。

  清单3. 用于将中介处理程序中转到总线中的所有目的地的代码片段
  set listdest “-bus $busname -type Queue”
  foreach destination [$AdminTask listSIBDestinations $listdest] {
   set destination_name [$AdminConfig showAttribute $destination  identifier]
   set query “WebSphere:*,type=SIBQueuePoint,cluster=$cluster_Name,
    SIBus=$busname,name=$destination_name”
   set queuePoints [$AdminControl queryNames $query]
   set med2dest “-bus $busname -destinationName $destination_name
    -mediationName $mediation_Name -node $node_Name -server $server “
    $AdminTask mediateSIBDestination  $med2dest
   }
 
  ·在目的地上中转中介处理程序以后,重新启动服务器以使更改生效。

  发现SCA异步调用模式

  在将该中介连接到所有的相关目的地以后,您可以访问JSP页面以向SCA运行时发送异步请求。该JSP页面应该与图8所示类似。

  图8. JSP发送异步请求

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 联合创新,携手共赢 华为与Commvault签署全球合作联盟协议

    【中国,上海,2015年9月19日】在2015年华为云计算大会上,全球领先的信息与通信解决方案供应商华为与美国知名的数据管理软件及相关服务主要供应商Commvault签署全球合作联盟协议。基于合作协议,双方将会加大投入数据中心备份解决方案在云化环境下的“可服务化”技术研究 。Commvault公司全球业务发展副总裁Andreas May、华为IT数据中心解决方案总裁马力出席签约仪式。

  • 用于.NET的可移植HTTP客户端

    关于在.NET、Silverlight、Windows Phone和Windows Store之间分享代码的问题之一,依旧是缺少发起HTTP请求的能力。

  • 松散耦合的七个级别

    在软件领域,“耦合”一般指软件组件之间的依赖程度。那么,什么是依赖?各种依赖对耦合度和松散度有多大影响?软件耦合可以发生在许多级别。必须区分生成时(编译时)依赖和运行时依赖。在分布环境中,为了确定系统的耦合程度,必须分析各个级别。下面我们就来具体看一下。

  • 数据虚拟化:数据整合问题的解决方案?

    数据整合是一个非常困难的问题,但是据专家称,一种相对新颖的信息管理方法可以帮助人们解决这个问题,即数据虚拟化。让我们来看看具体是如何解决的?