示例模型:
<mule> <model> <service name="GreeterUMO"> <inbound....> <filtering-router> .... </filtering-router> </inbound> <component.... /> <outbound....> ....... </outbound> <default-service-exception-strategy> ..... </default-service-exception-strategy> </service> <service name="GreeterUMO2" initialState="stopped"> ... </service> </model> </mule> |
Mule配置文件由以下标签组织成一颗XML元素树:
定义应用程序中的服务;
配置一个服务;
服务的描述内容;
配置入站路由,它们的端点以及入站转换器;
配置一个或多个出站路由,它们的端点以及出站转换器;
配置一个异步应答路由,它用于异步请求/响应消息中;
配置连接器或模型或服务上的错误处理策略;
将服务组件编织成一个应用程序是由配置文件来完成的,Mule的配置设置是由开发人员负责的,它们包括:
1、服务组件的声明;
2、哪个服务上的端点将接收消息;
3、将消息引入到服务组件之前使用哪个转换器;
4、出站端点上的消息下一步改流向哪里;
5、消息的路由信息将其发送到下一个服务组件。
Mule组件是通过指定实施类名配置的,Mule为组件接收的每个消息创建新的类实例,注意是一个特定的Java类而不是函数:
<component class="org.my.ServiceComponentImpl" /> |
Mule创建一批组件,共用组件配置,对象工厂创建一个单一的对象实例也可以指定:
<pooled-component class="org.my.ServiceComponentImpl" /> <component> <singleton-object class="org.my.ServiceComponentImpl" /> </component> |
Mule可以创建一个入口点分解器基于消息负载情况动态选择调用的函数:
<component class="org.my.PrototypeObjectWithMyLifecycle"> <entry-point-resolver-set> <array-entry-point-resolver /> <callable-entry-point-resolver /> </entry-point-resolver-set> </component> |
这个入口点分解器用于组件实现org.mule.api.lifecycle.Callable接口,组件可以实现Callable接口废除一切动态解决方案,并调用接口函数进行替代;
这个自定义入口点分解器可以和实现了org.mule.api.model.EntryPointResolverSet接口的类一起实施,为了准确地在你的端点上指定函数,你可以在端点上使用函数参数,如:
<ejb:endpoint host="localhost" port="1099" object="SomeService" method="remoteMethod" /> |
Mule提供了多个简单有用的组件用于测试和初始化原型,如<log-component/>,它将所有接收到的消息输出到控制台中;
使用它声明一个全局范围的端点,在整个Mule应用程序中都可以使用,在一个服务中,"ref="用于引用全局端点:
<file:endpoint name="fileReader" reverseOrder="true" comparator="org.mule.transport.file.comparator.OlderFirstComparator" />
<model> <service name="Priority1"> <file:inbound-endpoint ref="fileReader" path="/var/prio1" /> ...... </service> <service name="Priority2"> <file:inbound-endpoint ref="fileReader" path="/var/prio2" /> ...... </service> </model> |
这是服务组件接收事件的通道,它包括使用的传输器,地址,路径或资源(任何有效的URI):
<inbound-endpoint address="udp://localhost:65432" /> <inbound-endpoint address="jms://test.queue" /> |
这个是组件返回的数据被发送出去的通道;
<outbound-endpoint address="smtp://user:[email protected]" /> <outbound-endpoint address="smtp://user:[email protected]" /> |
这个路由在入站消息上应用一个或多个过滤器,符合要求的消息被转送到组件:
<inbound> <selective-consumer-router> <mulexml:jxpath-filter expression="msg/header/resultcode = 'success'" /> </selective-consumer-router> <forwarding-catch-all-strategy> <jms:endpoint topic="error.topic" /> </forwarding-catch-all-strategy> </inbound> |
这个路由通过检查入站消息的唯一性消息ID确保服务接收的消息是唯一性的,ID可以使用idExpression属性中定义的表达式生成:
<inbound> <secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26"> <simple-text-file-store directory="./idempotent" /> </secure-hash-idempotent-receiver-router> </inbound> |
这个路由通过计算消息内容的散列值确保服务接收到的消息的唯一性:
<inbound> <secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26"> <simple-text-file-store directory="./idempotent" /> </secure-hash-idempotent-receiver-router> </inbound> |
这个路由使用过滤器确定消息是否匹配特定的标准;
<outbound matchAll="true"> <filtering-router> <endpoint address="jms://deposit.queue" /> </filtering-router> <filtering-router> <jms:outbound-endpoint queue="large.deposit.queue" /> <mulexml:jxpath-filter expression="deposit/amount >= 100000" /> </filtering-router> </outbound> |
这个路由匹配所有的消息,通过一个配置好的端点发送出去;
<outbound> <pass-through-router> <smtp:outbound-endpoint to="[email protected]" /> </pass-through-router> </outbound> |
这个路由用于从单个端点发送相同的消息到多个端点,或实施消息属性或有效负载确定的下一个目的地的路由滑动行为;
<outbound> <static-recipient-list-router> <payload-type-filter expectedType="javax.jms.Message" /> <recipients> <spring:value>jms://orders.queue</spring:value> <spring:value>jms://tracking.queue</spring:value> </recipients> </static-recipient-list-router> </outbound> |
以为传输器声明一个描述连接信息的端点URI的值:
<rmi:endpoint name="BadType" host="localhost" port="1099" object="MatchingUMO" method="reverseString" /> <jms:inbound-endpoint queue="test.queue" /> <ssl:endpoint name="clientEndpoint" host="localhost" port="60198" synchronous="true" /> <quartz:endpoint name="qEP6" repeatCount="10" repeatInterval="1000" jobName="job" /> |
同样,可以使用<connector>元素定义一个连接器配置,Mule使用标准的组件,如Work Manager高效共享线程资源,并为线程使用提供更多控制,对于错误,你也要象事务行为一样声明一个异常策略:
<vm:connector name="VMConnector"> ... <default-connector-exception-strategy> <vm:outbound-endpoint path="systemErrorHandler" /> </default-connector-exception-strategy> </vm:connector> |
可以配置一个本地或全局的转换器,本地转换器定义在端点上,而全局转换器是在需要的时候进行引用的,下面的代码定义了两个全局转换器:
<xm:xml-to-object-transformer name="XMLToExceptionBean" returnClass="org.mule.example.errorhandler.ExceptionBean" /> <custom-transformer name="ExceptionBeanToErrorMessage" class="org.mule.example.errorhandler.ExceptionBeanToErrorMessage" returnClass="org.mule.example.errorhandler.ErrorMessage" /> |
在现有的字符串上追加了一个字符串:
<append-string-transformer name="myAppender" message=" ... that's good to know!" /> |
通过XSLT处理XML负载:
<mulexml:xslt-transformer name="xslt" xslFile="./conf/xsl/cd-listing.xsl"> <mulexml:context-property key="title" value="#[header:ListTitle]" /> <mulexml:context-property key="rating" value="#[header:ListRating]" /> </mulexml:xslt-transformer> |