开发组件(Developing Components)

Developing Components

当你在开发一个服务组件的时候,你侧重点在开发处理业务逻辑的代码上,而不是在与Mule ESB集成服务组件上。
例如,你想开发一个服务组件来添加一个客户到你的发票上,你侧重在编写代码来查询客户数据库并且根据需要来

更新你的发票。你不需要编写特殊代码来处理消息传递到服务组件上或者与Mule的集成。所有的集成处理都是通过

配置来实现的。你可以开发一个服务组件正如POJO,或者像Spring这样流行容器上的web service,EJB, 或者Plexus。

Mule允许你启用你的服务组件来获取信息或者控制当前信息而不是刚刚处理过的信息,启用服务组件直接对信息进行

处理,你必须在你的服务组件中实现Callable接口。(看如下Entry Points)。

开始开发一个Mule的服务组件,你可以使用Eclipse插件,你也可以使用标准组件standard components,或者

使用你自己的。

入口点(Entry Point)

入口点就是当你的组件接收到信息的时候被Mule调用的方法,在你的endpoint中明确指出你的入口点,你可以在

endpoint中使用方法参数,如下:

<outbound-endpoint address="ejb://localhost:1099/SomeService?method=remoteMethod"/>

或者

<ejb:endpoint host="localhost" port="1099" object="SomeService" method="remoteMethod"/>

如果你不指定这个参数,入口解析器将会根据你的消息类型来动态的选择被调用的方法。当有一个方法被匹配的时候,

该方法连同它的参数类型一同被缓存以至于在service的生命周期中每个方法内省操作只做一次,如果有多个方法被

匹配或者没有方法匹配的时候将抛出错误,你同时也可以在组件中调用一个无参方法。

另外你的组件可以实现org.mule.api.lifecycle.Callable接口,如果你实现了该接口,它将覆盖动态解析,取而代之的

是调用接口实现的方法。更多详细的入口解析器配置可以参考Entry Point Resolver Configuration Reference.

旧版本的入口解析器集合(Legacy Entry Point Resolver Set)

如果没有任何解析器被配置的话LegacyEntryPointResolverSet将被使用,LegacyEntryPointResolverSet提供了

如下通用的入口解析:

1.校验服务组件的注解方法(参考org.mule.impl.model.resolvers.AnnotatedEntryPointResolver)

2.如果有一个指定了“method”属相值,就使用它(参考org.mule.model.resolvers.MethodHeaderPropertyEntryPointResolver)

3.如果组件实现了org.mule.api.lifecycle.Callable接口,则onCall(MuleEventContext)方法将用来接收信息

4.如果以上情况都不满足,则异常将被抛出,服务组件在mule中注册失败

有许多场景是LegacyEntryPointResolverSet不适合的,你可以通过继承它的实现集合或者通过配置一个全新全面的

集合来实现更多有效的控制。例如:org.mule.model.resolvers.CallableEntryPointResolver ,

org.mule.model.resolvers.MethodHeaderPropertyEntryPointResolver ,和 org.mule.model.resolvers.ReflectionEntryPointResolver。

虽然这些被使用在LegacyEntryPointResolverSet,当他们单独指定的时候将被更加全面的配置。

调用无参方法(Calling No-arguments Methods)

如果你想调用一个无参方法你可以使用org.mule.model.resolvers.NoArgumentsEntryPointResolver。

无论当前信息是什么类型,它都只查找组件中无参的方法,另外如果接收到的是NullPayload类型,ReflectionEntryPointResolver

能够支持无参的服务方法。

自定义你的入口解析器(Custom Entry Point Resolver)

如果你想创建一个自定义的入口解析器,你的类需要实现EntryPointResolver接口,并且在你的配置文件中指定

<custom-entry-point-resolver>。

默认的消息流行为(Default Message Flow Behavior)

Mule中有许多默认的行为规则来管理消息的流向或者从组件而来:

1.当一个消息被接收的时候,上面描述的入口点方法将被调用

2.如下情况反馈或者输出信息将被获取:

  *如果方法返回值不为void,(Callable.onEvent()返回一个对象),该返回对象将被使用,如果返回了null,

  则当前请求将没有后续的操作。

  *如果该方法返回值为void,调用方法的参数将被使用,这假设该参数本身被改变或者没有改变的消息

3.如果inbound endpoint有一个交换模式配置了反馈然后这个组件的结果将被返回给调用者

4.该outbound信息根据服务的<outbound>配置被路由

参考Service Messaging Styles来了解更多不同的配置影响着工作流详细的情况。

自定义消息流行为(Customizing the Message Flow Behavior)

自定义消息流行为,你必须获取org.mule.api.MuleEventContext的引用,你可以通过实现Callable接口来获取引用, 

public interface Callable

{

  public Object onCall(MuleEventContext eventContext) throws Exception;

}

从MuleEventContext中,你可以同步和异步的发送和接收事件,管理事务和覆盖默认的事件流行为,例如:

MuleEventContext context = RequestContext.getEventContext();

OutboundEndpoint endpoint = ..

//to send asynchronously

context.dispatchEvent(new MuleMessage("IBM:0.01", null), endpoint);

//or to request

InboundEndpoint endpoint = ...

MuleMessage quote = context.requestEvent(endpoint, 5000);

你甚至可以通过MuleEventContext进行手动的控制事件流,但你的方法返回的时候,Mule将路由

outbound事件,如下情况你可以停止处理事件流:

1.如果你的服务方法不返回void你可以返回一个null,这个方法告诉mule没有后续的事件信息需要处理

2.如果你的服务方法返回void,Mule将使用inbound消息类型作为outbound消息类型,你可以使用

setStopFurtherProcessing方法来覆盖行为。

阻止消息流(Halting Message Flow)

为了阻止消息流,你可以调用来自MuleEventContext的setStopFurtherProcessing()方法,或者你可以抛出一个异常。

这将导致组件中的ExceptionStrategy被调用。

组件生命周期(Component Lifecycle)

你的组件实现了许多生命周期的接口,生命周期流看起来如下,onCall()通常会被入口解析器替换。

以下是最常用的接口:

org.mule.api.lifecycle.Initialisable在组件生命周期中仅仅被调用一次,当组件被创建当组件池被初始化的时候调用。

org.mule.api.lifecycle.Startable当组件启动的时候被调用,这个仅发生一次,当服务启动的的时候,无论组件通过API或者JMX

停止或者启动。

org.mule.api.lifecycle.Stoppable当组件被停止的时候被调用,这个发生在服务停止的时候或者组件通过API或者JMX停止的时候。

org.mule.api.lifecycle.Disposable当组件被注销的时候调用,这个只被调用一次当服务器被关闭的时候。

原文地址:http://www.mulesoft.org/documentation/display/MULE3USER/Developing+Components




posted @ 2011-04-06 16:32  wuwenyu  阅读(421)  评论(0)    收藏  举报