Professional Documents
Culture Documents
目 录
第一章. 入门指南 .............................................................................................................................4
1.1. 简介 .........................................................................................................................................4
1.1.1. 什么是Mule? .................................................................................................................4
1.1.2. Mule是一个企业服务总线么? .....................................................................................5
1.1.3. 为什么Mule? .................................................................................................................5
1.1.4. 如何开始? .....................................................................................................................5
1.1.5. 从哪里学到更多? .........................................................................................................6
1.2. 下载 .........................................................................................................................................6
1.3. 安装 .........................................................................................................................................6
1.3.1. 先决条件 .........................................................................................................................6
1.3.2. 在Windows系统上安装...................................................................................................7
1.3.3. 在Linux/Unix系统上安装 ...............................................................................................7
1.3.4. 源代码安装 .....................................................................................................................7
1.3.5. 附录:布局 .....................................................................................................................7
1.4. 首次运行 .................................................................................................................................7
1.5. 运行 .........................................................................................................................................7
1.5.1. 引言 .................................................................................................................................7
1.5.2. MULE_HOME和MULE_BASE.......................................................................................7
1.5.3. Java Service Wrapper......................................................................................................7
1.5.4. 通过脚本启动Mule.........................................................................................................8
1.5.5. 将Mule作为一个服务运行 .............................................................................................8
1.5.6. 直接启动Mule.................................................................................................................8
1.5.7. 停止Mule.........................................................................................................................8
1.5.8. Linux/Unix后台进程 .......................................................................................................8
1.6. 使用例子 .................................................................................................................................9
1.7. 源码构建 .................................................................................................................................9
1.8. 许可证 .....................................................................................................................................9
1.9. 最新消息 .................................................................................................................................9
1.10. 常见问题解答 .........................................................................................................................9
1.1. 简介
Mule是围绕ESB的概念而设计的,但提供了更大的灵活性,通过这种方式服务之间可以
互 相 通 信 。 ESB 是 在 消 息 总 线 概 念 的 标 准 上 , 然 而 Mule 服 务 可 以 跨 越 整 个 信 道
(Communication Channels)进行通信。可以将ESB想象成一个拓扑结构——一种组织计算
机及他们之间交互的方式。Mule与ESB的不同之处在于Mule不但支持ESB的拓扑结构,而且
支持更多其他类型如:管道(pipeline) 、对等网(peer network)
、客户/服务器(client/server)、
集线器-轮辐(hub-and-spoke)、嵌入试(embeded)等。这些方式还可以被混合使用以满足
复杂的企业通信和服务建模需求。更多信息查看拓扑结构页面。
Mule 工程及通用消息对象的主要目标:
可伸缩的通信框架,可以处理大多数复杂的系统集成。
使用简单、功能强大的服务器,可以运转在复杂的拓扑网络之上。
简单、自治的组件开发和部署。
代码重用。如果所有组件都是自包含的、独立的工作单元,他们可以被插接到
任何其他系统中。
迅速推向市场。使用 Mule 可以节省时间,减小开发和维护开销。
灵活而又强大的配置,可以非常容易的管理分布式环境。
在 Mule 工程启动之时,市场上似乎存在一个缺口——以一种简单的、轻量级的方式编
写处理数据的组件,并且不需要关心数据的发送者或接收者、数据的格式或者用于发送/接
收数据的技术。这里最关键的特性就是“简单”,尽管许多代理或集成技术提供了连接异构
系统的方式,但通常情况下,需要做许多额外的编码工作来获取你所期望的行为,以及将数
据递送到你所期望的地方。Mule 使你能够快速的开发组件,然后通过配置而不是编码来改
变他们的行为。
1.1.4. 如何开始?
这再简单不过了,最快速的方式就是按照“入门指南”菜单所列的连接学习。
例子是你熟悉 Mule 最好的方式,强烈建议从“Echo Example”开始,它提供了一个简
单的、逐步的过程来建立一个组件并通过不同的通道对外暴露。
1.1.5. 从哪里学到更多?
1.2. 下载
1.3. 安装
1.3.1. 先决条件
操作系统
Mule 可以运行在任何支持 java 的操作系统上,包括:
• Mac OSX
环境
• Java Developer Kit (JDK) 1.4.x or greater for deployment and JDK 1.5.x for building Mule from
source. Download .
• The JAVA_HOME environment variable must be set to the directory where the JDK is installed,
e.g. c:\java\j2sdk1.4.2_08.
• You PATH environment variable should also contain the path to the JDK bin directory, e.g.
;c:\java\j2sdk1.4.2_08\bin.
• Maven 1.0.2 (required for building from source and running some examples). Download .
• A compression tool such as WinZip (Windows) or GZip (Linux/Unix) for uncompressing the
Mule distribution.
• For Linux/Unix users working from the shell, you'll need a download tool such as wget or ftp.
磁盘空间
• 40 MB of disk space for the Mule binary distribution.
1.3.4. 源代码安装
1.3.5. 附录:布局
1.4. 首次运行
1.5. 运行
1.5.1. 引言
1.5.7. 停止 Mule
Kill PID
PID 是 Mule 进程的 id。
Jobs
(该命令显示你当前运行的所有 jobs 的列表)
Disown %{jobNumber}
1.6. 使用例子
1.7. 源码构建
1.8. 许可证
1.9. 最新消息
1.10. 常见问题解答
第二章. Mule 指南
1.1. 用户指南
1.1.1. 架构介绍
1.1.1.1. 概述
基本概念
从最最基础的级别来讲,Mule 就是一个被称为容器或 Mule Model 的对象代理。容器负
责管理操作对象,或称通用消息对象 UMO。这家伙(UMO)就是相互之间或者与外部系统
之间进行通信的普通 java 对象 POJO。通信的点被叫做“端点”。
模型
模型是管理和执行你的组件的容器。它控制你的组件上的消息流,管理线程、生命周期
和池。默认的 MuleModel 基于 SEDA 架构,以一种高效的、基于事件的队列模型来最大化
性能和吞吐量。
UMO 组件
UMO 代表通用消息对象,该对象能够从任何地方发送或者接收事件。UMO 组件就是
你的业务对象,执行针对进入总线的事件的业务逻辑。这些组件是标准的 java 对象,不需
要任何 Mule 特定的代码。Mule 基于组件的配置来路由、转换经过组件的事件。
端点
端点是 Mule 通信能力的基础。一个端点在两个或多个组件、应用及知识库之间定义了
一条信道(Communication Channel)。端点提供了一种强大的方式来允许你的对象之间以一
种统一的方式跨越任何协议进行通信。可以为一个端点配置消息过滤器、安全拦截器和事务
信息,来控制谁(who)以什么方式(how)发送或者接收什么(what)信息。
外部应用
外部应用可以是:应用服务器、遗留人事系统、大型机事物系统或者一个独立客户端应
用等任何形式。基本来说,任何可以通过某种方式提供或消费服务的应用都是外部应用。
Mule 使用端点来执行所有的通信,UMO 组件完全不知道是什么应用产生的数据、应用在什
么地方以及所使用的传输协议。
Mule 对象
Mule 内部使用的术语可能有些混乱,但是很简单:
对象术语 描述
Transport 一个传送器或称“提供者”,就是一组对象为 Mule 提供支持来处
理一种特定的传输或协议。例如,“Emain Provider”使 Mule 能
够通过 SMTP、POP 或 IMAP 协议发送和接收消息。
Connector 一个连接器就是端点上发送和接收消息的对象。连接器被绑定为
特定的传输器或提供者的一部分。例如,
“FileConnector”可以读
写文件。
Router 一个路由器当连接器接收到消息后或在消息发送之前对该消息
执行某些操作。
Filter 过滤器负责对流经连接器的消息进行过滤。过滤器与路由器联合
使用。
Transformer 转换器通过某种方式改变进出的消息。例如,ByteArrayToString
转换器将字节数组转换成 String 对象。
1.1.1.2. 模型
深入一个 Mule 模型
所有的 Mule 模型都实现了 UMOModel 接口。该接口描述了一个 Mule 服务的行为。该
接口发布的字段和方法如下:
Name – 一个字符串代表模型的名称,作为<model>标签的一个属性被设置。当一
个单独的配置文件中存在多个模型时需要设置该属性。
EntryPointResolver – 实现 UMOEntryPointResolver 接口的类,
ExceptionListener – 整个模型的异常策略。异常策略被用来处理所有组件处理消息
时发生的异常。
LifecycleAdaptorFactory -
1.1.1.3. 端点
1.1.1.4. 传输器
1.1.1.5. 连接器
1.1.1.6. 路由器
1.1.1.7. 过滤器
1.1.1.8. 转换器
1.1.2. 配置 Mule
快速开始
通过命令行或脚本来
1.1.2.2. 配置选项
1.1.2.4. 配置端点
1.1.2.5. 传输器指南
1.1.2.6. JMX 管理
1.1.2.7. 配置 Jms
1.1.2.8. 配置属性
1.1.2.9. 常规传输器配置
1.1.2.10. 对象容器
1.1.2.11. 配置服务方法
1.1.3. 使用 Mule
使用 Spring configuration:
注意,可以使用多个用逗号分隔的配置文件,也可以使用一个单独的配置文件。
//异步发送一个 JMS 消息
Client.dispatch(“jms://my.queue”,”some data”,null);
//通过一个配置好的邮箱接收一个 pop3 消息
UMOMessage message = client.receive(“pop3://ross:secret@mail.company.com”,3000);
//同步发送一个 VM 内部消息
UMOMessage message2 = client.send(“vm://my.object”,”some data”,null);
<context-param>
<param-name>org.mule.config</param-name>
<param-value>/WEB-INF/mule-config-main.xml,mule-component.xml</param-value>
</context-param>
<listener>
<listener-class>org.mule.builders.MuleXmlBuilderContextListener</listener-class>
</listener>
上下文参数可以是类路径也可以是文件路径,同时也可以指定多个配置文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mule-spring-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.sf.web.context.ContextLoaderListener</listener-class>
</listener>
同样,上下文参数可以是类路径也可以是文件路径,多个文件用逗号分隔。
//异步发送一个 JMS 消息
Client.dispatch(“jms://my.queue”,”some data”,null);
//通过一个配置好的邮箱接收一个 pop3 消息
UMOMessage message = client.receive(“pop3://ross:secret@mail.company.com”,3000);
//同步发送一个 VM 内部消息
UMOMessage message2 = client.send(“vm://my.object”,”some data”,null);
1.1.3.4. 编写组件
Entry Points
组件接收事件之后,Mule 会执行 entry point 方法。当组件接收事件之后,Mule 根据事
件的 payload 类型动态选择调用的方法。这意味着你的组件可能有多个 entry point。事件的
payload 类型几乎总是由为组件接收事件的提供者的日入向转换器所决定,但是一些提供者
如 SOAP 提供者自己管理类型的映射,因此不需要转换器。
如果你需要调用组件的无参的方法,阅读“调用无参方法”章节。
Event Flow
对于进出组件的事件流的管理,Mule 有一些默认的行为规则。
1. 当一个事件被接收之后,Entrypoint 方法按照上面描述的方式被调用。
2. 响应或出向消息通过如下方式获得:
a) 如果调用的方法不是 void 类型的,使用方法的返回值。如果返回 null,对于
当前请求,没有需要后续处理。
b) 如果调用的方法是 void 类型,使用调用方法时的参数。假定参数本身不变,
并且没有对事件做任何改变。
3. 出向事件被按照组件配置自动路由:
a) 如果已经配置了一个出向路由器,则使用该路由器路由事件。
b) 如果只配置了一个出向端点,则使用该端点路由事件。
c) 如果配置了多个出向端点,则使用第一个端点路由事件。
定制行为
尽管默认的事件流行为是充分的,很多时候你可能希望在某些点上定制它。为了实现这
个目的,需要获取一个 org.mule.umo.UMOEventContext 的引用。有两种方式可以实现:
实现 org.mule.umo.lifecycle.Callable 接口。事件上下文作为一个参数被传递给该接口。
通过 EventConetxt,可以同步/异步的发送或接收事件、管理事务、重写默认的事件流行
为。例如:
Context.setStopFurtherProcessing(true);
组件生命周期
组件可以实现一个或多个生命周期接口,如下:
Org.mule.umo.lifecycle.initialisable – 在组件生命周期中只调用一次。在组件池
初始化、组件被创建时调用。
Org.mule.umo.lifecycle.startable – 组件启动时调用。该方法在服务器启动时执
行一次,每次组件被停止,然后由 API 或 JMX 启动时都调用。
Org.mule.lifecycle.stoppable – 组件停止时调用。该方法在服务器启动时执行一
次,每次组件由 API 或 JMX 停止时都被调用。
Org.mule.lifecycle.disposable – 组件销毁时调用。该方法在服务器停止时执行。
获取组件描述符
通过实现 org.mule.impl.UMODescriptorAware 接口,组件可以在启动时获取它的描述符
的引用。
UMODescriptor 保存一个组件的所有配置信息。
1.1.3.5. 编写传输器
1.1.3.6. 异常策略
异常策略用于处理处理事件过程中发生的异常情况。有两个对象支持异常策略:组件和
连接器。另外,可以在 Model 上设置一个公用的组件异常处理策略。
与组件或模型关联的异常策略用于处理组件异常。典型的是业务逻辑异常,用户通常会
定制异常处理器来控制如何记录或路由这些异常。
与连接器关联的异常策略用于处理连接器在发送或接收事件时出现的异常。开发者通常
不会定制该异常策略,但是该策略可能被配置为将异常路由到一个公用的错误队列。
模型(以及所有由该模型管理的组件)默认使用的异常策略是:
org.mule.impl.DefaultComponentExceptionStrategy ; 连 接 器 默 认 使 用 :
org.mule.impl.DefaultExceptionStrategy。这两种类型的策略都可以被配置来指派到一个或多
个端点上。
组件异常策略
可以在 Mule xml 配置文件的<exception-strategy>元素上为组件配置异常策略:
<model name=”myModel”>
……
<exception-strategy className=”org.mule.impl.DefaultComponentExceptionStrategy”/>
……
</model>
可以在异常策略上配置一个端点,来将失败的事件发送到指定的目的地,例如一个错误
队列。Org.mule.impl.DefaultComponentExceptionStrategy 是一个默认的实现,可以配置一个
端点:
实现你自己的策略,可以继承 org.mule.impl.AbstractExceptionListener,尽管强烈建议继
承 org.mule.impl.DefaultComponentExceptionStrategy 并重写 defaultHandler()方法。可以向为
Mule 其他对象配置属性一样,使用<properties>元素为定制的异常策略配置属性:
对异常进行所有的必要的处理是 defaultHandler()方法的责任。换句话说,任何时候都不
要让异常策略向外抛异常。即便是发生了致命的异常,异常策略也要把它处理掉。例如,使
用一个错误队列时异常事件派发失败了,你或许要停止当前的组件并触发一个服务器通知来
向监控系统告警并把事件写到文件中。
在某些情况下,你或许想要改变记录异常的方式。如果这样,你只能重写
AbstractExceptionListener 的 logException()方法。
连接器异常策略
可以通过同为组件配置异常策略一样的方式来为连接器配置异常策略:
最主要的不同就是连接器异常策略要处理的异常的类型。这些异常通常都与连接相关,
不确定是否能够被恢复。Org.mule.impl.DefaultExceptionStrategy 是连接器默认使用的异常策
略,该策略只是简单的记录异常并继续。
1.1.3.7. 国际化
1.1.3.9. Mule 端点
1.1.3.10. 消息路由器
1.1.3.11. 事务管理
1.1.3.15. Mule 安全
1.1.4. Mule 集成
1.1.4.1. 应用服务器
1.1.4.2. 对象容器
1.1.4.3. Java 网格
1.1.4.6. Quartz
1.1.4.7. 安全
1.1.4.8. 事务管理
1.1.4.9. WEB 服务
1.1.4.10. 集群
1.1.5. 工具
1.1.5.2. Benchmark
1.1.5.3. 配置查看器
1.1.6. 建议阅读
1.2. 编程指南
1.2.1. 引言
先决条件
本指南假设你已经理解了 Mule、ESB 和 J2EE 的核心概念。如果你还不了解 Mule ,
请先阅读入门指南部分。
1.2.2. 编程模型
理解处理消息过程中所调用的不同元素以及那些元素你可以控制,可以帮助你更好
的理解编程模型和那些部分需要你来编写。
1.2.2.1. 入向消息流程阶段
入向消息流程阶段在传输器接收到数据后被触发(例如数据将要被写入 DB 或者
Socket)。Mule 传输器提供者负责接收这些数据并把它们包装成一个 Mule 消息。入向路由
器负责在这些进入的消息上应用路由逻辑,如幂等、重排序、批处理等。
Mule 消息结构
Mule 消息结构如下:
Payload:接收到的消息的主体
Property:接收到的消息的任何消息头和元信息(如文件名等)
例 如 , 可 以 通 过 -MuleMessage.getStringProperty(“Content-Type”,null)- 来 获 取
HTTP 请求的内容类型;可以通过-MuleMessage.getIntProperty(“JMSPriority”)-
来获取 JMS 消息的优先级。
入向路由器
入向路由器控制发送给组件的事件流,可以重新排序、集合或过滤进入的消息。例如,
IdempotentReceiver 将拒绝任何已经收到的入向消息;CorrelationResequencer 将持有许多相
关的事件,并按照一定的顺序(基于这些事件被分发的顺序)交给组件。
元素 定制 编码需求
端点 端点是 Mule 传输器上的一个配 在 Mule 中,编写你自己的传输器是一
(入向) 置,引入一个新的端点意味着引 件繁重的劳动。然而,大多数工作都已
入一个新的传输器。你可以定制 经有抽象类完成,你只需要在模板方法
一个已有传输器的行为来改变其 中编写传输器特定的代码即可。
接收和分发消息的方式。
路由器 Mule 提供了很多标准的出向路由 只有类似 CorrelationAggregator 的路由
(入向) 器,不用定制就可以直接使用。 器需要定制,插入把多个事件聚合为一
需要定制的唯一原因就是当需要 个事件的逻辑。
一些定制的逻辑来处理类似聚合
一组事件的事情。
1.2.2.2. 组件流程阶段
拦截器(前置)
拦截器用于拦截到服务组件的消息流。它们可以用来触发监控和事件或者中断消息流,
例如认证拦截器可以确保当前请求拥有正确的凭证来调用服务。
入向转换器
入向转换器用于将入向消息从底层传输格式转换成服务组件需要的格式。转换器可以组
成链,应该被用于数据级别的转换,例如从一种数据类型/格式转换成其他形式。
复杂转换
需要访问外部数据源的高级转换,如压缩或查找数据,建议由服务
组件来执行该任务;转换器应该被用来做简单的数据转换处理。
服务引用
服务就是业务逻辑。可以是 POJO、EJB、远程对象或其他任何类型的对象。服务组件
可以由 Mule 模型实例子化,也可以由其他容器(Spring、Hivemind、Pico 等)创建和存储。
调用服务
待续···
实现回调接口
更多信息阅读“编写组件”部分。
拦截器(后置)
如 果 配 置 在 服 务 上 的 拦 截 器 是 一 个 Envelope Interceptor ( 继 承
org.mule.interceptors.EnvelopeInterceptor),则其 after()方法将在组件完成处理后执行,开发
者可以在这个方法中插入一些行为。
元素 定制 编码需求
拦截器 可以为组件引入横向切面行为, 实现 org.mule.umo.UMOInterceptor 接
(前置) 如认证等。 口,该接口只有一个方法。
入向转换器 转换器用于将消息主体从一种数 任 何 转 换 器 类 都 应 该 继 承
据格式转换成另一种格式。转换 AbstractTransformer 类。该类提供了一
器可以被组成一个链,因此细粒 个抽象的 doTransform(…)方法需要被
度的转换器可以被重用。Mule 为 实 现 。 还 有 一 个
XML、XSLT 和标准 java 类型都 AbstractEventAwareTransformer 类,可
提供了转换器。传输器必须提供 以直接获取当前消息流的事件上下文
转换器来转换底层数据格式。 (UMOEventContext)。
服务引用 服务对象在此处被真正调用。该 这个对象由开发者编写,简单还是复杂
服务引用可以是 POJO、EJB、远 由服务的需求而定。服务对象本身不需
程对象,或者由容器(Spring、 要依赖 Mule。服务组件必须无状态或
Hivemind)实例化的对象。 者由共享数据存储库来管理状态,除非
该组件运行在没有并发的环境里。
拦截器 在服务组件被执行之后引入任何 开发者需要继承 EnvelopeInterceptor,
(后置) 横向切面行为。 在 after()方法中实现任何逻辑。
1.2.2.3. 出向消息流程阶段
出向消息流程在服务把结果消息(服务调用的输出)传递过来之后开始。如果没有结果
消息或者没配置出向路由器,则该阶段被跳过。
出向路由器
出向路由器负责控制消息下一步发送到哪里及如何发送。Mule 定义了很多标准的出向
路由器,包括著名的《企业集成模式》一书中所列的所有模式,附加其他一些路由模式。出
向路由器可以是基于内容的、基于路由表的、基于消息头的、动态的路由或这些形式的组合。
Mule 已经提供了标准的路由器,如 MessageSplitting、Multicasting 和基于内容的路由器。
出向转换器
待续···
出向端点
根据出向路由器的逻辑,被分派的事件可以有 0 个或多个出向端点。
元素 定制 编码需求
路由器
(出向)
转换器
(出向)
端点
(出向)
1.2.3. 消息和事件
1.3. 开发指南
1.4. 架构指南
1.4.1. 引言
1.4.2. 架构概述
最主要的目标是使应用之间能够使用标准的、协议开放和良好定义的模式进行集成。为
了达到这个目标,Mule 定义了很多组件来执行大多数必须的工作,使分离的应用和服务之
间可以交互。
应用
应用可以是任何种类,例如 WEB 应用、办公系统、应用服务器以及其他 Mule 实例等。
信道
可以是两点之间通信传输数据的任何方式。Mule 中使用信道将 UMO 组件连接起来,
同时也使用信道将跨本地网络或互联网的不同 Mule 节点连接起来。
当一个应用有信息要通信的时候,并不仅仅是把消息扔到消息系统里,而是将消息添加
到一个特殊的消息信道上;接收消息的应用也并不仅仅是随机从消息系统中取出信息,而是
从一个特殊的消息信道上接收信息。
消息接收者
消息接收者负责从应用中读取或接收数据。在 Mule 中,接收者就是 Transport 提供者的
一个元素,Mule 提供了非常多的 Transport,例如:JMS、SOAP、HTTP、TCP、SMTP、FILE
等。
入向路由器
入向路由器被用来控制关注某个通道的组件接收什么样的事件以及如何接收这些事件。
入向路由器可以被用来过滤、拆分、聚合、重新排序事件,在这些事件被 UMO 组件接收之
前。
连接器
连接器知道如何通过一个特定的通道发送和接收数据。一个消息接收器被结合在连接器
上,从连接器识别的资源注册感兴趣的数据。
转换器
转换器用于对消息/事件的 payload 进行类型转换。Mule 并没有定义一个标准的消息格
式(将来 Mule 可能会支持标准的业务处理定义消息类型)。转换器最直接的功能就是类型
转换,如将 JMS 消息转换成对象,或者对 XML 数据进行转换。数据转换与应用是紧密相
关的,Mule 提供了一个简单而又强大的转换框架。
端点
端点其实就是一个配置块,绑定了一个连接器、一个端点 URI、若干转换器、若干过滤
器和事务信息,提供了一个通道适配器。提供者将为其实例保存事务信息。
适配器担当了消息系统的通信客户端,通过应用指定的接口调用应用的功能。同时,通
道适配器可以监听应用内部的事件并调用消息系统对这些事件作出响应。
出向路由器
出向路由器将消息/事件发送到不同的提供者,依赖于事件的内容和其他配置好的规则。
1.4.4. 模型
1. 检 查 组 件 是 否 实 现 了 Callable 生 命 周 期 接 口 , 如 果 实 现 了 , 则 onCall
(UMOEventContext)方法被用于接收事件。
2. 如果组件上配置了一个转换器,则该转换器的返回类型和组件的方法进行匹配,看
是否有接受转换器返回类型的方法。如果有,该方法被使用。如果有多个方法匹配,
会抛出异常。
3. 组件上是否有接受 org.mule.umo.UMOEventContext 类型的方法,如果有,该方法
被使用。如果有多个方法匹配,会抛出异常。
4. 最后检查组件上是否有接受 java.util.Event 类型的方法,如果有,该方法被使用。
如果有多个方法匹配,会抛出异常。
5. 如果以上没有一条匹配,会抛出一个异常,并且组件注册失败。
Lifecycle Adapter
生 命 周 期 适 配 器 负 责 将 mule 组 件 的 生 命 周 期 映 射 到 底 层 组 件 , 由
org.mule.umo.lifecycle.UMOLifecycleAdapter 接口定义。DefaultLifecycleAdapter 只是简单的
把生命周期事件代理到底层组件,当这些组件实现了一个或多个 UMO 生命周期接口。
开 发 者 如 果 想 使 用 他 们 自 己 的 池 化 组 件 , 需 要 实 现
org.mule.umo.model.UMOPoolFactory 、 org.mule.util.ObjectPool 和
org.mule.util.ObjectFactory 三个接口。
1.4.5. Transport 提供者
连接器
端点地址
端点地址定义了任何形式的目的地或数据源,总是表现为 URI 的形式。如:
transport Description Example
POP3/SMTP 通常是用户名、密码和主机名 Pop3://user:password@mail.compay.com
JMS 一个主题或队列的名字 Jms://topic:myTopic
HTTP 一个主机地址,可能还有端口、 http://company.com/mule
路径和查询字符串
FILE 文件或目录的路径 File:///temp/data/in
VM 运行在同一个 VM 中的另一个 Vm://myUMO
UMO 组件的名字
SOAP 一个 UMO 组件的地址,被暴露为 Axis:http://company.com/mule/service/umo
一个服务或服务的地址供调用
端点地址总是通过连接器指定的协议和信息暴露为一个有效的 URI。
端点解释
本 节 描 述 Mule 解 释 一 个 端 点 URI 的 过 程 。 对 于 本 例 , 我 们 使 用
“jms://topic:myTopic?durable=true”,这是一个持久主题的 JMS URI。
1. ConnectorFactory 被调用
2. 在 META-INF/services/org/mule/providers 目录下查找匹配“jms”的服务描述
3. 一个 ConnectorServiceDescriptor 对象被创建
4. 可以在端点上指定为该 URI 使用一个新的连接器,还是使用现有的连接器。如果
没有指定该信息,将根据协议查找已有的连接器。
5. ConnectorServiceDescriptor 包含一个可用的端点生成器,端点被传递给该生成器。
6. 端点生成器根据 URI 规范将该 URI 分解成各个部件。
消息接收者
消息接收器或消息监听器负责从外部系统接收数据。连接器负责注册和反注册接收器。
根据所使用的外部系统,消息接收器的复杂度会有所不同。例如,JMS Provider 消息接收器
实现了 javax.jms.MessageListener 接口,JMS 连接器使用 JMS 连接来注册这个接收器。然而,
HTTP 消息接收器实现了一个 HTTP 服务器,以监听到达某个端口的特定请求。
消息适配器
消息适配器负责以通用的方式读取外部应用的数据对象,并按照接收这些数据时的格
式。UMOMessageAdapter 接口定义了一组方法用于读取任何 java 对象类型的载荷和属性。
事务
事务由 Provider 管理,当消息接收器接收到消息或消息分发器发送消息时事务被开始或
提交。Mule 事务管理的核心是 TransactionCoordinator,它负责管理事务的状态。关于 Mule
事务的更多信息阅读用户指南的“事务管理”章节。
要让 Mule 以相同的方式对待所有的事务,
Org.mule.umo.UMOTransaction – 底层事务的包装,
容器上下文
1.4.6. UMO 组件
1.4.7. 事件
1.4.8. 消息路由器
1.4.9. 拦截器
1.4.10. 异常管理
1.5. 传送器指南
Provider Description
AS400 DQ 连接 IBM AS400 数据队列通信服务器。
EJB 可以通过出向端点调用 EJB。
Email 提供多样的 email 连接选择。
File 可以在本地文件系统上读/写文件。可以配置连接器来过滤读/写文件的方
式,例如是否使用二进制输出或者追加的文件。
FTP 可以向远程 FTP 服务器读/写文件。
HTTP 在应用之间通过 HTTP 和 HTTPS 的方式进行通信。
IMAP
JDBC
JMS
Multicast
Pop3
Quartz
RMI
Servlet
SMTP
Soap
SSL
Stream
TCP
1.5.1.1. AS400 DQ Provider
HTTP 连接器属性
Property Description Default Required
secure 决定连接器是否使用 HTTPS 协议 false No
proxyHostname 若通过代理访问站点,该属性保存代理服务器地址 No
proxyPort 代理服务器的端口 No
proxyUsername 如果代理服务器需要认证,提供用户名 Yes
proxyPassword 代理服务器用户密码 Yes
timeout Socket 超时间隔 5000 Yes
buffersize 读/写数据的缓冲区大小 64*1024 Yes
HTTPS 连接器属性
Property Description Default Require
d
keyStore .keystore Yes
keyPassword Yes
(if
keyStore
is set)
storePassword Yes
keystoreType keyStore.getDef Yes
aultType()
keyManagerAlg 依赖 JDK 厂商, Yes
orithm 自动发现 (if
keyStore
is set)
trustManagerAl 依赖 JDK 厂商, No
gorithm 自动发现
protocolHandler 依赖 JDK 厂商, Yes
自动发现
requiredClientA true Yes
uthentication
provider 依赖 JDK 厂商, Yes
自动发现 (if
keyStore
is set)
clientKeyStore Yes
(if
connecto
r is being
used by
client)
clientKeyStoreP Yes
assword (if
clientKey
Store is
set)
trustStore 使 用 No
clientKeyStroe
trustStorePassw Yes
ord (if
trustStore
is set)
trustStoreType keystroke.getDe No
faultType()
explicitTrustStor false No
eOnly
keyManagerFac No
tory
trustManagerFa No
ctory
端点
HTTP 端点被描述为基于 Socket 的端点,其格式为:
http://localhost:1234
使用 HTTPS 协议的端点格式为:
https://localhost:1234
端点属性
任何 HTTP 响应头的值都可以作为端点属性。下面列出最常用的属性:
Property Description Default
http.status 响应的状态吗,如 200 代表请求成功。 200
Content-Type 消息载荷的类型。 Text/plain
Location 使用重定向时需要设置该属性,指明客户机重定向的地址。
下面是一个简单的例子,描述如何在端点上设置这些属性:
在这个例子中,消息载荷的类型是“text/html”,同时指示客户机重定向(“http.status”
被设置为 307,代表临时重定向)到http://mule.codehaus.org。
安全
为保证访问 HTTP 端点的请求的安全,HTTP 连接器支持 HTTP 基本/摘要身份认证方法
(和 Mule 的普通 header 认证一样)。如果想使用 HTTP 基本认证,需要在端点上配置一个
SecurityEndpointFilter。例如:
<endpoint address=”http://localhost:8080”>
<security-filter className=”org.mule.extras.acegi.filters.HttpBasicAuthFilter”>
<properties>
<property name=”realm” value=”mule-realm”/>
</properties>
</security-filter>
</endpoint>
发送凭证
要生成一个需要认证的 HTTP 请求,可以在端点上设置凭证,如下:
http://user:password@myCompany.com/secure
轮询 HTTP 服务
HTTP 传送器支持轮询一个 HTTP 地址,可以按如下方式配置 HTTP 轮询接收器:
按如下方式在端点上使用该连接器:
http://company.com/service?connector=pollingHttp&pollingFrequence=30000
等价的端点配置如下:
转换器
可以使用的转换器列表:
Transformer Description
HttpClientMethodResponseToObject 将一个 HTTP 客户端响应转换成对象,特别地,一个
Mule 消息。
HttpResponseToString 将一个 HTTP 客户端响应转换成一个 String。
UMOMessageToResponse 将一个实现 UMOMessage 的对象转换成 HTTP 响应。
如果端点明确设置了编码,则使用该编码
否则从 Mule 消息的 Content-Type 属性获取
如果以上都没有,则使用 Mule 管理器的默认配置
对于内容类型,使用 Mule 消息的 Content-Type 属性
如果没有设置 Content-Type 属性,使用“text/plain”(或许是 XML)
对于二进制内容,不需要编码类型,按如下方式这是内容类型:
如果 Content-Type 消息头被接收:
设置消息 Content-Type 属性
对于文本内容(以“text”开始),使用指定的编码将 payload 解释成 String
如果没有设置编码,使用 ISO-8859-1 作为默认的 HTTP 文本内容编码类
型,除非在端点上明确地设置编码。
不设置 Content-Type 属性
将 payload 作为字节读入
1.5.1.7. Imap Provider
VM 连接器属性
Property Description Default Required
queueEvents 决定是否要为连接器上的监听器设置队列。如果设置 false No
为 false,连接器只是简单的通过 Mule 服务器把事件
发送给组件。不强迫设置给属性,如果设置为 true,
队列将根据 MuleConfiguration 被配置。可以在配置中
指定是否持久化队列。
使用 VM 队列
当使用异步 VM 端点时,事件在内存中从一个组件传递到另一个组件(异步端点引入
了一个事件队列,线程可以从该队列中消费事件)。然而,当“queueEvents”属性被设置后,
事件可以存储在内存中,随后由客户端或组件进行消费。此外,这些队列可以被持久化并支
持 XA 事务。
要想使用 VM 队列,必须在连接器上设置“queueEvents”属性。所有要使用队列的 VM
端点都必须使用激活“queueEvents”属性的 VM 连接器。不能在端点上设置“queueEvents”
属性,该属性只能在连接器级别设置。例如:
<model name=”testModel”>
<mule-descriptor name=”testComponent” implementation=”com.mycompany.Component”>
<inbound-router>
<endpoint address=”vm://test.queue” connector=”vmQueue”/>
</inbound-rourer>
</mule-descriptor>
</model>
使用持久队列
VM 队列可以被持久化,因此在服务器宕机后仍然能够维护其状态。要想使 VM 队列持
久化,必须在 Mule XML 配置文件中设置一个持久化策略。该策略被 Mule 实例中的所有
VM 队列共享。例如:
<mule-environment-properties>
<queue-profile persistent=”true” maxOutstandingMessages=”1000”/>
<persistence-strategy className=”org.mule.util.queue.FilePersistenceStrategy”/>
</mule-environment-properties>
注 意 , 必 须 为 VM 队 列 配 置 添 加 一 个 <queue-profile> 元 素 。 同 时 需 要 增 加 一 个
<persistence-strategy>元素来告诉 Mule 如何持久化事件,如果该属性没有设置,Mule 将使用
默认的内存持久策略。
如果需要的话,用户可以编写自己的持久化策略,将事件写到数据库或其他存储中。自
定义的持久化策略必须实现 org.mule.util.queue.QueuePersistenceStrategy 接口。
使用事务
VM 队列支持事务,可以是 XA 分布式事务的一部分。要让 VM 队列拥有事务需要进行如下
配置:
同时,需要在配置中增加一个事务管理器。更多信息阅读“事务管理器”部分。
端点
VM 端点是一个“资源”端点,仅仅命名了一个“资源”,不需要主机地址或其他配置。
例如:
Vm://myComponent
使用 VM 队列的方式是一样的。
转换器
VM 传送器没有特殊的转换器。
1.5.1.23. WSDL Provider
1.6. 技术文章
1.7. 发布指南
第三章. Mule 实战
第四章. 高级专题