??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品人人做人人综合,自拍偷拍亚洲综合,国产成人精品亚洲日本在线观看http://www.aygfsteel.com/zzh6688/category/11642.html 太上Q不知有之;其次Q亲而誉之;其次Q畏之;其次Q侮之? 信不焉Q有不信焉?   (zhn)兮其贵a。功成事遂,癑֧皆谓Q「我自然」? zh-cnWed, 28 Feb 2007 05:32:38 GMTWed, 28 Feb 2007 05:32:38 GMT60SOA架构中的事g驱动服务http://www.aygfsteel.com/zzh6688/articles/49025.htmlL(fng)癑ַQ有容乃?/dc:creator>L(fng)癑ַQ有容乃?/author>Tue, 30 May 2006 08:08:00 GMThttp://www.aygfsteel.com/zzh6688/articles/49025.htmlhttp://www.aygfsteel.com/zzh6688/comments/49025.htmlhttp://www.aygfsteel.com/zzh6688/articles/49025.html#Feedback0http://www.aygfsteel.com/zzh6688/comments/commentRss/49025.htmlhttp://www.aygfsteel.com/zzh6688/services/trackbacks/49025.html SOA架构中的事g驱动服务
使用Mule框架设计事g驱动和面向服务的q_

作者:(x)Jeff Hanson

译?steven_guo


版权声明QQ何获得Matrix授权的网站,转蝲时请务必以超链接形式标明文章原始出处和作者信息及(qing)本声?/span>
作?Jeff Hanson;steven_guo
原文地址:http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html
中文地址:http://www.matrix.org.cn/resource/article/43/43929_SOA_Event_driven.html
关键词:(x) SOA,Event-driven


摘要
?qing)时响应实时的变化和事g成ؓ(f)?jin)企业架构的最重要需求。这文章讨论面向服务框架的技术和机制Q这些技术得该框架高效发送、接受那些跨层U结构的同步和异步事Ӟ而不需要知道生这些事件的pȝ斚w的细?br />
Internet事务QB2BpȝQP2PE序Q和实时工作,q些pȝ有着非常高的动态性,复杂的系l处理,用传l的面向q程的处理方法不能有效地实现?br />
一个面向服务的框架代表?jin)一个动态的q行时环境,在那里服务提供者和服务消费者松散耦合、更灉|的组件交互。徏立一个具备所有这些优势的交互模型Q成Y件开发中最优先考虑的。一个事仉动的交互模型Q比通常的请?响应机制对实时变化和Ȁ励有着更好的应{效率?br />
面向服务的架构和事g驱动的架构天生就有着对分布式pȝ的适应性,q些架构都有着模块性、松散耦合Q和适应性等Ҏ(gu)?br />
在这文章里Q讨Z用Mule实现一个高效的事g驱动和面向服务的q_Q一个轻量的事?消息架构Q企业信息ȝQESBQ模式。组件和E序可以使用Mule通过公共的JMS或其他的消息处理技术去实现通信?br />
面向服务架构概述
“面向服务”这个术语已l演变成一个架构,在那里服务作Z个Y件组件嵌入在企业业务逻辑和特新的核心中,Ҏ(gu)如下:(x)
·        松散耦合Q服务部与其它组件有着Ҏ(gu)蒂固的关p?br />·        协议独立Q多U协议透明讉K
·        位置不可知:(x)一个服务执行一l业务逻辑Q针对这ơ调用返回一个结?br />·        _粒度:(x)不论在什么位|均可访问该服务?br />·        l护无用L(fng)?br />
服务是典型地专注于解决业务领域的问题?br />
通常Q服务用端Ҏ(gu)配置数据Q注册项和Y件工厂去军_l服务的位置Q协议和公共接口?br />
应用E序通常被表q成他们有什么功能,而不q个应用E序是什么东西,包含什么。基于这个院应,更多直接描述一个应用程序通过使用动词Q服务)(j)而不是用名词Q应用主体)(j)。因为,一个名词(应用MQ是定义?jin)?jin)一个事务,而不是动作,当强制把一个组件有什么功能作Z个组件是什么来定义Q那׃(x)出现误解。在SOA领域Q一个应用程序能很自然的被描qͼ因ؓ(f)每个应用E序的业务逻辑操作能被描述成ؓ(f)一个服务的执行选择。因此,SOA解决?jin)这U误解,它允许应用程序和lg去访问一个服务所能实现的功能Q例如,他们执行什么动作。依ơ,应用E序开发者能更容易匹配他们的需要与适当的服务,因ؓ(f)服务接口的描q更完整地说清了(jin)他们要解决的问题?br />
事g驱动架构概述
一个事仉动框ӞEDAQ定义了(jin)一个设计和实现一个应用系l得Ҏ(gu)学,在这个系l里事g可传输于松散耦合的Y件组件和服务之间。一个事仉动系l典型地׃件消费者和事g产生者组成。事件消费者向事g理器订阅事Ӟ事g产生者向事g理器发布事件。当事g理器从事g产生者那接收C个事件时Q事件管理把q个事g转送给相应的事件消费者。如果这个事件消费者是不可用的Q事件管理这保留这个事Ӟ一D间隔之后再ơ{送该事g消费者。这U事件传送方法在Z消息的系l里是Q储存(storeQ和转送(forwardQ?br />
构徏一个包含事仉动构架的应用E序和系l,q样׃得这些应用程序和pȝ响应更灵敏,因ؓ(f)事g驱动的系l更适合应用在不可预知的和异步的环境里?br />
事g驱动设计和开发的优势Q?br />事g驱动设计和开发所提供的优势如下:(x)
·        可以更容易开发和l护大规模分布式应用E序和不可预知的服务或异步服?br />·        可以很容易,低成本地集成、再集成、再配置新的和已存在的英勇程序和服务
·        促进q程lg和服务的再用,拥有一个更灉|、没有Bug的开发环?br />·        短期利益Q更Ҏ(gu)定制。因计对动态处理又更好的响应?br />·        长期利益Q系l和l织的状态变得更_ևQ对实时变化的响应接q于同步?br />
EDA ?SOA 整合
不象h/响应pȝQ要求请求者必L发送请求信息,而一个事仉?架构提供一个机制去动态响应事件。在一个EDApȝ里,事g产生者发布事Ӟ事g消费者接受事件?br />
业务pȝ可以从SOA和EDA中受益匪,因ؓ(f)当事件发生时EDA能触发事件消费者,SOA服务可以快速地从相同的消费者中讉K、查询?br />
pȝ要有最高的响应性,当事件触发时q个pȝ必须能快速决定必ȝ动作。到事gl束Q事件应该被发布和消费,而且事g要穿SOA所有的边界Q包括整个体pȝ构和物理层?br />
?演示?jin)事件被Ȁ发和I越体系l构的所有层

?Q事件穿体pȝ构的层

在图1的环境中Q一个事件能被定义ؓ(f)Mpȝ的,q_的,lg的,业务的或英勇q程的变化。事件可能是高层的业务事件或底层的系l事件。因Z件能被传送和接收Q订阅事件的英勇E序和服务能对这些变化做出响应?br />
事g分类和因果关p?/span>

理解一个事件的U诀是知道这个事件发生的原因Q这个就是通常说的因果关系。事件的因果关系典型地分Zc:(x)
·        q关系Q时间源和触发在体系l构的同一层?br />·        垂直关系Q时间源和触发在体系l构的不同层?br />
垂直关系意味着一个事件的分类Ҏ(gu)Q这些事件保留了(jin)一些不变的东西而穿一个系l不同的层,事g分类如下Q?br />·        生命周期事gQ一个实体生命周期的变化Q例如一个进E的停止或启?br />·        执行事gQ运行时事gQ例如服务或lg的调?br />·        理事gQ当一个状态超q了(jin)预先的定义或一定范围时

q关系意味着一个事件的分类Ҏ(gu)Q这些事件保留了(jin)一些不变的东西而穿一个系l不同的层,事g分类如下Q?
·        pȝ层事Ӟ(x)pȝU动作,例如创徏一个文件或关闭一个端?br />·        q_层事Ӟ(x)q_U动?例如修改一个数据源或增加一个新的服?br />·        lg层事Ӟ(x)lgU动作,例如视图对象的{换或状态机变化
·        业务层事Ӟ(x)业务U动作,例如创徏用户或删除帐?br />·        应用层事Ӟ(x)应用U动作,例如增加保险金或报h(hun)提交

许多ESB框架和^台意识到在SOA中包含基于事仉动的通信有很多优ѝ在Java开发领域,Mule是q些最有前景的q_之一?br />
介绍Mule
Mule是一个开源消息ESB框架Q一个消息代理,一个分U事仉动的框架QSEDAQ。SEDA定义?jin)一个依照分U队列、高度ƈ行的企业U^台。Mule使用SED的概念增加事件处理的性能?br />
Mule支持同步、异步和h响应事gQ事件处理和传输实用不同的技术例如JMSQHTTPQ电(sh)子邮件和ZXML的RPC。Mule能很Ҏ(gu)地嵌入到M应用框架中,明确支持Spring框架。Mule也支持动态的Q预定义的,Z内容的和Z规则的消息\由。Mule使得预定义的和计划性的事务更容易,包括XA事务支持。Mule提供一个有代表性的状态调用(RESTQAPI提供l与Web的事件访问?br />
Mule ESB模式驱动pȝ中所有服务,q个pȝ有着一个分ȝ消息通讯中枢。服务注册在ȝ上,但不知道其他M被注册的消息Q因此,每个服务只关心处理它收到的事件。Mule也把容器Q传输,转换l节从服务中分离出来Q允怓Q何对象作为服务注册到ȝ的?br />
我用Mule框架LC文章所讨论的概念和思想

Mule框架
Mule框架主要包含下列内容Q?br />
通用消息对象QUMOQAPI
UMO APIW一?jin)所有被Mule 理的服务和对象交互

UMOlg
在Mulepȝ中,UMOlg可以使Q何在pȝ中接收、处理和发送事件消息的lg

Mule服务?/b>
Mule服务器组件是一个在Mule应用环境中自动加载的服务器应用程?br />
描述?/b>
描述器组件描qC个Mule UMO属性。新的Mule MUO对象能被它们所兌的描q器初始化。一个描q器包含Q?br />·        UMOlg?br />·        UMOlg版本
·        UMOlg实现c?br />·        异常{略
·        入站和出站提供?br />·        入站和出站\由器
·        拦截?br />·        接收和发送切入点
·        入站和出站{换器
·        各种各样的特?br />
q接?/b>
q接器是一些组Ӟ它们可以q接到外部系l或其他协议、管理那些系l或协议的状态。一个连接器负责发送消息到外部消息接收器、管理消息接收器的注册和注销?br />
提供?/b>

提供者是一些组Ӟ理把事件数据发送到外部pȝ、从外部pȝ接受事g数据和{换事件数据等事项。在Mule框架里,他们能连接到外部pȝ或其他组件。一个提供者就像一个从外部pȝq入Mule或从Mule内部讉K外部pȝ的桥接器。实际上Q提供者有一l对象组成,可以与下层系l连接ƈ与之通信。提供者的l成部g是:(x)
·        q接器:(x)负责q接C层系l?br />·        消息接收器:(x)从系l接收事?br />·        q接调度者:(x)传送系l到pȝ
·        转换器:(x)转换从系l接收到的或要发送到pȝ的数?br />·        l端Q所建立q接的通道地址
·        事务配制Q定义连接的事务属?br />
l端调解?/b>
当UMOlg接收C个事件时Q终端调解者决定去调用它的什么方?br />
转换?/b>
转换器组件负责双向{换消息或事g的有效蝲荗当一个事件到达接收的对象之前Q{换器可以链接C起去执行一pd的装换操作?br />
消息适配?/b>
消息适配器提供一中公q方式去读外部pȝ的异构数据?br />
消息接收?/b>
消息接收器是一些列l端监听U程Q负责从外部pȝ接收数据?br />
消息调度?/b>
消息调度者发送(同步Q或zNQ异步)(j)旉C层系l?br />
消息路由?/b>
消息路由器是一pdlgQ可以被配制的UMOlg依据消息或其他配制图路有一个消息到不同的提供者?br />
代理
代理是一些帮定到外部服务的组建,例如JME服务器?br />
Mule模型
一个Mule模型装和管理一个Mule服务器实例的q行时行为。一个模型包含:(x)
·        描述?br />·        UMOlg
·        一个终端调解?br />·        一个生命周期适配器工?br />·        一个组件调解?
·        一个池化工?
·        一个异常策?br />
Mule理?/b>
Mule理器维护和提供以下服务 Q?br />·        代理
·        提供?br />·        q接?br />·        l端
·        转换?br />·        拦截器堆?br />·        一个Mule模型
·        一个Mule服务?br />·        事务理?
·        应用E序属?br />·        Mule配制

?演示?jin)Mule框架上层消息视?br />
?QMule上层架构

Mule事g对象
Mule事g对象对象包含事g数据和被lg所感知和操控的属性。属性是L的,在事件创Z后Q何时间可被设|?br />
org.mule.umo.UMOEventcM表了(jin)一个在Mule环境中出现的旉。所有在lg之间发送或接收的数据都是org.mule.umo.UMOEvent的一个实体。可以访问一个原始的或被转换的Mule事g对象中的数据能。一个Mule事g对象使用一个与提供者管理的提供者{换数据,提供者收到数据后把事件中的有效蝲药{换成当前lg所识别的格式?br />
一个Mule事g对象的有效有效蝲药通过org.mule.umo.UMOMessage接口讉KQ一个org.mule.umo.UMOMessage实例由有效蝲荷和它的属性组成。这个接口是不同技术实现的消息对象的一个抽象?br />
org.mule.extras.client.MuleClientcd义了(jin)一个简单的借口Q允许Mule客户端从Mule服务器接收和发送事件数据。在大多数Mule应用E序里,旉是被一些外部的q发行ؓ(f)所触发Q例如一个主题上接收到消息或在目录里一个文件被删除?br />
下面演示?jin)如何去发送一个同步事件到另外的MulelgQ?br />
String componentName = "MyReceiver"; // The name of the receiving component. 
String transformers = null; // A comma-separated list of transformers
                            // to apply to the result message.
String payload = "A test event"; // The payload of the event.
java.util.Map messageProperties = null; // Any properties to be associated
                                        // with the payload.
MuleClient client = new MuleClient();
UMOMessage message = client.sendDirect(componentName,
                                       transformers,
                                       payload,
                                       messageProperties);
System.out.println("Event result: " + message.getPayloadAsString());


MuleClientc需要一个服务器URL区定义它所q接的远EMule服务器的l端。URL定义?jin)传输协议、接收消息的地址Q提供者在zN一个事件时可以随时使用q些信息。终端例C如下:(x)
·        vm://com.jeffhanson.receivers.Default: 使用虚拟机的提供者派遣到一个com.jeffhanson.receivers.Default
·        jms://jmsProvider/accounts.topic:使用全局注册的jmsProviderzN一个JMS消息到ccounts.topic.
·        jms://accounts.topic: 使用W一个(默认Q的JMS提供者派遣JMS消息

Mule事g处理
Mule可以在三U不同的方式发送和节后艘事Ӟ(x)
1Q异步方式:(x)一个组件可通过不同的线E同时处理多个事件的发送和接收
2Q同步方式:(x)在一个组仉新工作之前,一个单一的事件必被处理完。换a之,一个创Z(jin)事g的组建发送事件时被LQ直到发送Q务完成,因此Q一ơ只允许处理一个事?br />3Q请?应答方式Q一个组Z门请求一个事Ӟ然后{待一个特定的旉L收回应?br />org.mule.impl.MuleComponent实现cL供了(jin)一个具体的l徏c,它包括又有创建,发送和接收事g的功能?br />执行同步动作的对象应该实现org.mule.umo.lifecycle.Callable接口Q这个定义了(jin)一个简单的Ҏ(gu)Object onCall(UMOEventContext eventContext)。Callable接口提供支持事g调用的UMO对象。虽然不是强制的Q但q个接口提供?jin)一个生命周期控制的Ҏ(gu)Q当实现q个接口的组建接收到一个消息时执行q个Ҏ(gu)。下面展CZ(jin)q个接口的简单实现?br />
import org.mule.umo.lifecycle.Callable;

public class EchoComponent
   implements Callable
{
    public Object onCall(UMOEventContext context) throws Exception
    {
        String msg = context.getMessageAsString();
        // Print message to System.out
        System.out.println("Received synchronous message: " + msg);
        // Echo transformed message back to sender
        return context.getTransformedMessage();
    }
}


从onCallQ)(j)Ҏ(gu)可返回Q何对象。当lg的UMOLifecycleAdapter接收q个对象Ӟ它首先看看这个对象是否是一个UMOMessageQ如果这个对象既不是UMOMessage也不是NullQ那么以q个对象作ؓ(f)有效载荷dZ个新的消息。这个新事gl由所配制的出站\有器发布Q如果UMO对象已经配制?jin)一个出站\由器Q那么在UMOEventContext实例中不能调用setStopFurtherProcessing(true)Ҏ(gu)?br />
Mule使用的一个简单的事g框架
让我们把q几DMule的代码放C起去构徏一个简单的事g框架。这个框架包含一个负责注册和注销事g的管理器Q可以接收事Ӟ和负责\有同步和异步消息C们相应的服务?br />
Mule的虚拟机协议要求有一个放|事件管理器工作目录META-INF/services/org/mule/providers/vm路径下的可配制文Ӟ配制文g为协议定义了(jin)大量的组Ӟ例如q接器和调度工厂。配制文件的内容如下Q?br />
connector=org.mule.providers.vm.VMConnector
dispatcher.factory=org.mule.providers.vm.VMMessageDispatcherFactory
message.receiver=org.mule.providers.vm.VMMessageReceiver
message.adapter=org.mule.providers.vm.VMMessageAdapter
endpoint.builder=org.mule.impl.endpoint.ResourceNameEndpointBuilder


一个简单的借口定义?jin)事件管理器的公有结构?x)
package com.jeffhanson.mule;

import org.mule.umo.FutureMessageResult;

public interface EventManager
{
   /**
    * Sends an event message synchronously to a given service.
    *
    * @param serviceName    The name of the service to which the event
    *                       message is to be sent.
    * @param payload        The content of the event message.
    * @return Object        The result, if any.
    * @throws EventException on error
    */
   public Object sendSynchronousEvent(String serviceName,
                                      Object payload)
      throws EventException;

   /**
    * Sends an event message asynchronously to a given service.
    *
    * @param serviceName    The name of the service to which the event
    *                       message is to be sent.
    * @param payload        The content of the event message.
    * @return FutureMessageResult The result, if any.
    * @throws EventException on error
    */
   public FutureMessageResult sendAsynchronousEvent(String serviceName,
                                                    Object payload)
      throws EventException;

   /**
    * Starts this event manager.
    */
   public void start();

   /**
    * Stops this event manager.
    */
   public void stop();

   /**
    * Retrieves the protocol this event manager uses.
    * @return
    */
   public String getProtocol();

   /**
    * Registers a service to receive event messages.
    *
    * @param serviceName      The name to associate with the service.
    * @param implementation   Either a container reference to the service
    *                         or a fully-qualified class name.
    */
   public void registerService(String serviceName,
                               String implementation)
      throws EventException;

   /**
    * Unregisters a service from receiving event messages.
    *
    * @param serviceName  The name associated with the service to unregister.
    */
   public void unregisterService(String serviceName)
      throws EventException;
}


事g理器类是被装在一个工厂类里,因此Q可以依据需要去改变它的实现而不?x)?jing)响到它的客户端。事件管理器实现如下Q?br />
package com.jeffhanson.mule;

import org.mule.umo.*;
import org.mule.extras.client.MuleClient;
import org.mule.impl.endpoint.MuleEndpoint;
import org.mule.config.QuickConfigurationBuilder;

import java.util.HashMap;
import java.util.Map;

public class EventManagerFactory
{
   private static HashMap instances = new HashMap();


   /**
    * Retrieves the event manager instance for a given protocol.
    *
    * @param protocol      The protocol to use.
    * @return EventManager The event manager instance.
    */
   public static EventManager getInstance(String protocol)
   {
      EventManager instance = (EventManager)instances.get(protocol);

      if (instance == null)
      {
         instance = new EventManagerImpl(protocol);
         instances.put(protocol, instance);
      }

      return instance;
   }

   /**
    * A concrete implementation for a simple event manager.
    */
   private static class EventManagerImpl
      implements EventManager
   {
      private UMOManager manager = null;
      private QuickConfigurationBuilder builder = null;
      private MuleClient eventClient = null;
      private String protocol = null;
      private MuleEndpoint receiveEndpoint = null;
      private MuleEndpoint sendEndpoint = null;

      private EventManagerImpl(String protocol)
      {
         this.protocol = protocol;
      }

      /**
       * Starts this event manager.
       */
      public void start()
      {
         try
         {
            builder = new QuickConfigurationBuilder();
            manager = builder.createStartedManager(true,
                                                   protocol + "tmp/events");
            eventClient = new MuleClient();
            receiveEndpoint = new MuleEndpoint(protocol
                                               + "tmp/events/receive");
            sendEndpoint = new MuleEndpoint(protocol + "tmp/events/send");
         }
         catch (UMOException e)
         {
            System.err.println(e);
         }
      }

      /**
       * Stops this event manager.
       */
      public void stop()
      {
         try
         {
            manager.stop();
         }
         catch (UMOException e)
         {
            System.err.println(e);
         }
      }

      /**
       * Retrieves the protocol this event manager uses.
       * @return
       */
      public String getProtocol()
      {
         return protocol;
      }

      /**
       * Registers a service to receive event messages.
       *
       * @param serviceName      The name to associate with the service.
       * @param implementation   Either a container reference to the service
       *                         or a fully-qualified class name
       *                         to use as the component implementation.
       */
      public void registerService(String serviceName,
                                  String implementation)
         throws EventException
      {
         if (!manager.getModel().isComponentRegistered(serviceName))
         {
            try
            {
               builder.registerComponent(implementation,
                                         serviceName,
                                         receiveEndpoint,
                                         sendEndpoint);
            }
            catch (UMOException e)
            {
               throw new EventException(e.toString());
            }
         }
      }

      /**
       * Unregisters a service from receiving event messages.
       *
       * @param serviceName  The name associated with the service to unregister.
       */
      public void unregisterService(String serviceName)
         throws EventException
      {
         try
         {
            builder.unregisterComponent(serviceName);
         }
         catch (UMOException e)
         {
            throw new EventException(e.toString());
         }
      }

      /**
       * Sends an event message synchronously to a given service.
       *
       * @param serviceName    The name of the service to which the event
       *                       message is to be sent.
       * @param payload        The content of the event message
       * @return Object        The result, if any.
       * @throws EventException on error
       */
      public Object sendSynchronousEvent(String serviceName,
                                         Object payload)
         throws EventException
      {
         try
         {
            if (!manager.getModel().isComponentRegistered(serviceName))
            {
               throw new EventException("Service: " + serviceName
                                        + " is not registered.");
            }

            String transformers = null;
            Map messageProperties = null;
            UMOMessage result = eventClient.sendDirect(serviceName,
                                                       transformers,
                                                       payload,
                                                       messageProperties);
            if (result == null)
            {
               return null;
            }
            return result.getPayload();
         }
         catch (UMOException e)
         {
            throw new EventException(e.toString());
         }
         catch (Exception e)
         {
            throw new EventException(e.toString());
         }
      }

      /**
       * Sends an event message asynchronously.
       *
       * @param serviceName    The name of the service to which the event
       *                       message is to be sent.
       * @param payload        The content of the event message.
       * @return FutureMessageResult The result, if any
       * @throws EventException on error
       */
      public FutureMessageResult sendAsynchronousEvent(String serviceName,
                                                       Object payload)
         throws EventException
      {
         FutureMessageResult result = null;

         try
         {
            if (!manager.getModel().isComponentRegistered(serviceName))
            {
               throw new EventException("Service: " + serviceName
                                        + " is not registered.");
            }

            String transformers = null;
            Map messageProperties = null;
            result = eventClient.sendDirectAsync(serviceName,
                                                 transformers,
                                                 payload,
                                                 messageProperties);
         }
         catch (UMOException e)
         {
            throw new EventException(e.toString());
         }

         return result;
      }
   }
}


Mule框架依据消息有效载荷的类型来zN消息。事件框架用基于有效蝲L(fng)zN机制Q这U派遣机制把注册C件管理器中一般定义的事gҎ(gu)作ؓ(f)事g接收器。下面的cd义了(jin)一个包含三个重载的receiveEventQ)(j)Ҏ(gu)的服务:(x)
package com.jeffhanson.mule;

import java.util.Date;

public class TestService
{
   public void receiveEvent(String eventMessage)
   {
      System.out.println("\n\nTestService.receiveEvent(String) received "
                         + "event message:  " + eventMessage + "\n\n");
   }

   public void receiveEvent(Integer eventMessage)
   {
      System.out.println("\n\nTestService.receiveEvent(Integer) received "
                         +"event message:  " + eventMessage + "\n\n");
   }

   public void receiveEvent(Date eventMessage)
   {
      System.out.println("\n\nTestService.receiveEvent(Date) received "
                         + "event message:  " + eventMessage + "\n\n");
   }
}


事g理器客L(fng)应用E序发送三个事件到试服务中,L试每一个receiveEventQ)(j)Ҏ(gu)。客L(fng)应用E序如下Q?br />
package com.jeffhanson.mule;

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.BasicConfigurator;

import java.util.Date;

public class EventClient
{
   static Logger logger = Logger.getLogger(EventClient.class);

   public static void main(String[] args)
   {
      // Set up a simple configuration that logs on the console.
      BasicConfigurator.configure();
      logger.setLevel(Level.ALL);

      try
      {
         EventManager eventManager =
            EventManagerFactory.getInstance("vm://");
         eventManager.start();

         String serviceName = TestService.class.getName();
         String implementation = serviceName;

         eventManager.registerService(serviceName, implementation);

         Object result =
            eventManager.sendSynchronousEvent(serviceName, "A test message");

         if (result != null)
         {
            System.out.println("Event result: " + result.toString());
         }

         result =
            eventManager.sendSynchronousEvent(serviceName, new Integer(23456));

         if (result != null)
         {
            System.out.println("Event result: " + result.toString());
         }

         result =
            eventManager.sendSynchronousEvent(serviceName, new Date());

         if (result != null)
         {
            System.out.println("Event result: " + result.toString());
         }

         eventManager.stop();
      }
      catch (EventException e)
      {
         System.err.println(e.toString());
      }
   }
}


Muleq_化和抽象?jin)前面所叙述框架的事件方面的处理Q得你发送和接收I越一个层U结构的同步和异步消息时Q不需要知道下层系l的l节。工厂模式和SOA准则的应用,则得这个框架有?jin)一个松散耦合和可扩展的设计?br />
ȝ
当服务和q程需要穿多层结构,使用多种协议M互时Q设计一个有效地事g驱动的Y件系l可能变得复杂了(jin)。可是,一个用标准模式包含适当事g理层的面向服务架构能减,甚至消除q些问题?br />
Mule q_提供APIQ组件和抽象对象Q这些都可以用于d立一个强大,健壮Q事仉动的有着良好的׾~性和可维护性的pȝ?br />
关于作?/b>
Jeff Hanson 有着18q的软g行业从业l验Q曾l作为高UY件工E师工作于Windows OpenDoc目Q作Z架构师在Novell的Route66框架工作。现在,作ؓ(f)eReinsure.com的首席架构师Q正在构建Web服务框架和基于J2EE再保险^台。Hanson已经写作?jin)大量的文章和书c,包括Q《Pro JMX: Java Management Extensions?Apress出版C?2003q?1? ISBN: 1590591011)和《Web Services Business Strategies and Architectures?Wrox 出版C?2002q?? ISBN: 1904284132)

资源
·javaworld.com:javaworld.com
·Matrix-Java开发者社?http://www.matrix.org.cn/
·Mule主页: http://wiki.muleumo.org/display/MULEPROJ/Home
·Mule FAQ: http://wiki.muleumo.org/display/MULE/Mule+FAQ


]]>
Web 服务的业务流E执行语ahttp://www.aygfsteel.com/zzh6688/articles/49004.htmlL(fng)癑ַQ有容乃?/dc:creator>L(fng)癑ַQ有容乃?/author>Tue, 30 May 2006 07:21:00 GMThttp://www.aygfsteel.com/zzh6688/articles/49004.htmlhttp://www.aygfsteel.com/zzh6688/comments/49004.htmlhttp://www.aygfsteel.com/zzh6688/articles/49004.html#Feedback0http://www.aygfsteel.com/zzh6688/comments/commentRss/49004.htmlhttp://www.aygfsteel.com/zzh6688/services/trackbacks/49004.html阅读全文

]]>
实现SOA的两个案? (from 51cto)http://www.aygfsteel.com/zzh6688/articles/48988.htmlL(fng)癑ַQ有容乃?/dc:creator>L(fng)癑ַQ有容乃?/author>Tue, 30 May 2006 06:34:00 GMThttp://www.aygfsteel.com/zzh6688/articles/48988.htmlhttp://www.aygfsteel.com/zzh6688/comments/48988.htmlhttp://www.aygfsteel.com/zzh6688/articles/48988.html#Feedback0http://www.aygfsteel.com/zzh6688/comments/commentRss/48988.htmlhttp://www.aygfsteel.com/zzh6688/services/trackbacks/48988.html 

我们有许多方法可以实现面向服务的架构Q无论最l目标是消除大型是简单地重用软g资。匹兹堡大学ȝ中心 (UPMC)和Starwood Hotels & Resorts Worldwide公司都有正在q行中的SOA目Q这无疑表明?jin)SOA实施q程的多h。对于这两种不同方向的工作,他们在本质上都是要徏立集中的用于存储和编制Y件资产的仓库?/p>

对于匹兹堡大学医疗中?UPMC)而言Q一个目标就是在l织内部充分利用单个SOA 开发项目的价|q同时也涉及(qing)C(jin)理问题。“我们已l做?jin)很有h(hun)值的工作Q但是在其他的领域却不能被普遍用的。”UPMC企业中间件小l的MQ Duane Falk说。“我们朝着SOA的方向发展不仅仅是ؓ(f)?jin)用它的一些技术来帮助我们解决问题Q我们也在努力朝着使资源重用性更高的方向发展。?/p>

Falk 说我们选出?jin)一些高U开发h员和架构师来讨论开始的最?jng)_炏V“普遍的意见是把某些资聚集在一hq图书馆Q在那里Z可以识别、存储、读取这些可以重用的代码和其他资源。”他说?/p>

匹兹堡大学医疗中?UPMC)正在使用匹兹堡市(jng)LogicLibrary公司提供的Logidex原数据仓库来规模的实验一个项目。Falk 说一个研发小l正与一个v外开发h员联合重构程序来理ȝ器械资?/p>

“我们已l感觉到q样做是有优势的:保在最后阶D|们把全部的代码和对象攑֜保存完好的中心位|,虽然开发中我们只用C(jin)其中的一部分Q但是放在这里我们以后可以l重用。?/p>

q个目l用Logidex来对pȝ设计、架构还有开发的其他服务q行分类。“其他小l,如企业中间gl,他们在写用于不同领域的Web服务和核心组件的代码Q而且我们希望把那些代码也攑ֈ仓库中来。”Falk说。这个仓库也可能?x)帮助UMPC理一致性问题,如Sarbanes-Oxley Act?/p>

“我们这个小实验的一个主要目的就?我们所有的开发h员都能够应用LogicLibraryQ不仅仅是我们的目可以讉KQ而且要做到其他组同样可以讉K。即使他们只有一个或者两个服务,但是他们可以获得文档记录和发表方面的l验Qƈ且这样做会(x)帮助我们军_是否l箋朝着SOA的方向前q。?/p>

记录和管理服务在Starwood Hotels & Resorts Worldwide公司也是中心论题Q这里正在进行的SOA目的目标是最大限度的消除大型机?/p>

Starwood公司是通过一pd的合q和收购建立的,其中最大的是Sheraton子公司?/p>

“那个时候,理层做出决?l箋保留Sheratonpȝq且作ؓ(f)主要的预订系l。我们终止了(jin)ZIBM技术、客L(fng)控制pȝ(CICS)以及(qing)Cobol应用E序的大型机遗留pȝQ?srael del Rio_(d)Starwood公司的技术方案和架构高副总裁?/p>

大约三年以前QStarwood公司军_朝着SOA的方向发展,q且对Linux、J2EE和IBM WebSphere实现标准化。他说。“最开始的时候,我们通过在这些^C开发新的应用程序,之后逐渐开始卸载一些大型机应用E序攑ֈ开攄l上来。这时我们也开始发展一些XML服务Q但那ƈ不是我们现在所见到的Web服务Q”他说?/p>

Del Rio?一q半之前QStarwood 公司为消除大型机l出?jin)致命一凅R“一切都围绕着SOA的概念,”他说。ƈ且没有移植的应用E序Q他补充道。“所有的一切都是通过服务从零开始编写代码、进行设计。那是巨大的工作d。?/p>

Z(jin)理不同的小l开发的服务QStarwood公司使用Systinet公司提供的Systinet注册信息表,q个公司位于ȝ的伯灵顿?“我们在注册信息表中(Registry)定义?0%?0%的服务。我们将l束C百计的服务,?del Rio说。Starwood公司目前使用Systinet来进行支配和{略理Q同时用Actional 公司的Looking Glass产品用于服务理QActional 公司位于加州的Mountain View?jng)?/p>

现在Q服务都必须和内部系l绑定在一Pdel Rio_(d)因此Starwood公司不再使用Systinet公司l一描述、发现和集成(UDDI)的功能。“但是知道他们公司有q个功能q是很好的。我们已l打把一些服务做成公共服务。?/p>

2006q的W一季度QStarwood公司开始在新系l上实现一些独立属性,然后做集成测试。“我们研I的范围是徏立在能够消除大型机的基础之上Q”他说。这是?006q底实现的目标?/p>

对于Starwood公司QSOA的道路是正确的,但是del Rio说这条\又是充满艰险的。“SOA是一个好的概c(din)我们应该朝着SOA的方向发展,管实现的过E是艰辛的。这是成熟的历E。?/p>

]]>
վ֩ģ壺 | | Զ| ͨ| | | | | е| | Ǧɽ| | | ˱| פ| | | | ī| | ɽ| | | | ϳ| ˮ| | ׼| ƽ| | ó| | | β| Ҷ| | ɳ| ɽ| Զ| ½| |