You are on page 1of 40

Mule 参考手册

目 录
第一章. 入门指南 .............................................................................................................................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

第二章. MULE指南 .........................................................................................................................9

1.1. 用户指南 .................................................................................................................................9


1.1.1. 架构介绍 .........................................................................................................................9
1.1.2. 配置Mule.......................................................................................................................12
1.1.3. 使用Mule.......................................................................................................................13
1.1.4. Mule集成 .......................................................................................................................20
1.1.5. 工具 ...............................................................................................................................21
1.1.6. 建议阅读 .......................................................................................................................21
1.2. 编程指南 ...............................................................................................................................21
1.2.1. 引言 ...............................................................................................................................21
1.2.2. 编程模型 .......................................................................................................................22
1.2.3. 消息和事件 ...................................................................................................................25
1.3. 开发指南 ...............................................................................................................................25
1.4. 架构指南 ...............................................................................................................................25
1.4.1. 引言 ...............................................................................................................................25
1.4.2. 架构概述 .......................................................................................................................25
1.4.3. Mule管理器 ...................................................................................................................27
1.4.4. 模型 ...............................................................................................................................27
1.4.5. Transport提供者 ...........................................................................................................29
1.4.6. UMO组件 ......................................................................................................................31
1.4.7. 事件 ...............................................................................................................................31
1.4.8. 消息路由器 ...................................................................................................................31
1.4.9. 拦截器 ...........................................................................................................................31
1.4.10. 异常管理 .......................................................................................................................31
1.4.11. Mule对象层级 ...............................................................................................................31
1.5. 传送器指南 ...........................................................................................................................31
1.5.1. Mule核心传送器 ...........................................................................................................31
1.6. 技术文章 ...............................................................................................................................40
1.7. 发布指南 ...............................................................................................................................40

第三章. MULE实战 .......................................................................................................................40

第四章. 高级专题 ...........................................................................................................................40


第一章. 入门指南

1.1. 简介

1.1.1. 什么是 Mule?

Mule 是一个基于 ESB(企业服务总线)架构概念的消息通信(messaging)平台。一个


ESB 担当一种转接系统,在网络内部或外部的系统间传输数据。ESB 定义了一系列端点
(Endpoints)
,通过这些端点,应用可以向系统发送或从系统接收数据。消息总线——系统
的心脏——负责在端点之间路由消息。ESB 的通信构架(backbone)通常使用 JMS 实现,
但是任何其他类型的消息服务器实现如 MSMQ、IBM MQ Series 或者 Tibco Rendevouz 都可
以被使用。

事实上,Mule 已经超出了一个典型 ESB 的定义。我们更愿意将 Mule 定义为一个轻量


级的通信框架,使用一个分布式对象代理(broker)来管理应用之间的通信。对象代理的作
用点是管理服务组件(Service Component)。这些组件被叫做“通用消息对象”或 UMOs,
基本上就是普通 java 对象。UMOs 可以存在于相同的 JVM 中,也可以被分散到网络或互联
网中。对象代理本身遵循事件驱动架构(SEDA)设计模式。UMOs 及其他应用之间的所有
通信都是通过消息端点实现。这些端点为广泛的、全异的技术如 JMS、JDBC、SMTP、TCP、
HTTP、XMPP、FILE 等提供了一个简单的、一致的接口。

下图展示了一个使用 Mule 的通用方案。Mule 应用通常由许多跨网络的 Mule 实例组成。


每个实例都是一个轻量级容器,持有一个或多个 MUO 组件。每个 UMO 组件有一个或多个
端点,通过这些端点发送或接收事件。
1.1.2. Mule 是一个企业服务总线么?

Mule是围绕ESB的概念而设计的,但提供了更大的灵活性,通过这种方式服务之间可以
互 相 通 信 。 ESB 是 在 消 息 总 线 概 念 的 标 准 上 , 然 而 Mule 服 务 可 以 跨 越 整 个 信 道
(Communication Channels)进行通信。可以将ESB想象成一个拓扑结构——一种组织计算
机及他们之间交互的方式。Mule与ESB的不同之处在于Mule不但支持ESB的拓扑结构,而且
支持更多其他类型如:管道(pipeline) 、对等网(peer network)
、客户/服务器(client/server)、
集线器-轮辐(hub-and-spoke)、嵌入试(embeded)等。这些方式还可以被混合使用以满足
复杂的企业通信和服务建模需求。更多信息查看拓扑结构页面。

Mule 提供了一种简单、强大的编程模型,使用端点将 POJO 服务连接在一起,并且不


假定正在被使用的消息和接口。Mule 的最终目标是成为集成领域的“瑞士军刀”。它可以适
应现有的技术,而不是规定使用某种特有的技术。使用 Mule,对于你的集成服务层没有任
何硬性的规定,你可以使用 JBI、EJB、大型机应用、Messaging、WEB 服务、Sockets 和文
件系统,并且以一种简单的、一致的方式与它们交互。

1.1.3. 为什么 Mule?

Mule 工程及通用消息对象的主要目标:
可伸缩的通信框架,可以处理大多数复杂的系统集成。
使用简单、功能强大的服务器,可以运转在复杂的拓扑网络之上。
简单、自治的组件开发和部署。
代码重用。如果所有组件都是自包含的、独立的工作单元,他们可以被插接到
任何其他系统中。
迅速推向市场。使用 Mule 可以节省时间,减小开发和维护开销。
灵活而又强大的配置,可以非常容易的管理分布式环境。

在 Mule 工程启动之时,市场上似乎存在一个缺口——以一种简单的、轻量级的方式编
写处理数据的组件,并且不需要关心数据的发送者或接收者、数据的格式或者用于发送/接
收数据的技术。这里最关键的特性就是“简单”,尽管许多代理或集成技术提供了连接异构
系统的方式,但通常情况下,需要做许多额外的编码工作来获取你所期望的行为,以及将数
据递送到你所期望的地方。Mule 使你能够快速的开发组件,然后通过配置而不是编码来改
变他们的行为。

Mule 绝对不是一个现有应用框架的替代品。事实上,Mule 使用了许多开源项目如 AXIS、


Spring、XFire、ActiveMQ、PicoContainer 等。Mule 填补了企业 Java 开发领域的一个空白,
即一个应用需要与多种平台上的多种系统进行复杂的交互。Mule 在一个健壮的、解偶合的
环境中将她们连接起来,并且提供了必要的支持在这些系统之间路由、传输和转换数据。

1.1.4. 如何开始?

这再简单不过了,最快速的方式就是按照“入门指南”菜单所列的连接学习。
例子是你熟悉 Mule 最好的方式,强烈建议从“Echo Example”开始,它提供了一个简
单的、逐步的过程来建立一个组件并通过不同的通道对外暴露。

1.1.5. 从哪里学到更多?

当你阅读过该指南并看过一些例子应用之后,可能会想深入学习 Mule。Mule 框架的确


是有非常多东西需要学习,但是不要让这个吓倒你:)。核心概念会在用户指南中解释。如果
你想更加深入的学习,Mule 指南中还有其他指南可以帮助你。

1.2. 下载

1.3. 安装

1.3.1. 先决条件

操作系统
Mule 可以运行在任何支持 java 的操作系统上,包括:

• Windows XP SP2 and Windows 2000.

• Linux, Solaris, AIX and HP-UX.

• 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.

4 MB of disk space for the Mini Mule distributions.

1.3.2. 在 Windows 系统上安装

1.3.3. 在 Linux/Unix 系统上安装

1.3.4. 源代码安装

1.3.5. 附录:布局

1.4. 首次运行

1.5. 运行

1.5.1. 引言

1.5.2. MULE_HOME 和 MULE_BASE

自从 1.3.3 版本以后,Mule 支持在同一台计算机上安装多个 Mule,就和 Apache Tomcat


的方式一样。

1.5.3. Java Service Wrapper

Mule使用Java Service Wrapper(http://wrapper.tanukisoftware.org )来控制本地操作系统的


JVM。Wrapper提供了很多高级选项和特性,你可以在Wrapper的WEB站点上找到这些内容。
简单扼要的说,Java Service Wrapper可以将Mule作为Windows NT服务或Uninx进程安装(或
移除)。Wrapper可以处理系统信号,在JVM和本地系统之间提供更好的交互。
1.5.4. 通过脚本启动 Mule

1.5.5. 将 Mule 作为一个服务运行

1.5.6. 直接启动 Mule

1.5.7. 停止 Mule

无论是 Windows 环境还是 Unix 环境,都可以在运行 Mule 的命令“控制台”执行


“CTRL+C”命令来停止 Mule。

如果 Mule 是作为 Unix 后台进程运行的,那么该进程可以被杀死,例如:


Ps –ef|grep mule

Kill PID
PID 是 Mule 进程的 id。

1.5.8. Linux/Unix 后台进程

如果你通过一个 Shell 来运行 Mule,并且希望 Shell 关闭后 Mule 仍然继续运行,则要


作为一个后台进程来运行。你可以使用 nohup 来做这个,例如:
nohup mule -config mule-config.xml
或者使用 disown 使其成为后台进程:
Mule –config mule-config.xml

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。通信的点被叫做“端点”。

下面是 Mule 服务组件的一个简单图解:


Mule 管理器
Mule 管理器是 Mule 服务实例的核心。它的主要角色是为 Mule 实例管理各种对象,如
连接器、端点和转换器等。这些被管理的对象被用来控制你的组件/服务的消息流,为模型
及其管理的组件提供服务。

模型
模型是管理和执行你的组件的容器。它控制你的组件上的消息流,管理线程、生命周期
和池。默认的 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 实例中的服务组件的运行时行为。组件被调用和处理的方


式完全被封装在当前的 Mule 模型中。默认情况下,Mule 使用 SEDA 模型,但同时也提供
了许多其他模型。

可以通过<model>标签的 type 属性来指定使用哪种模型。可以在同一个 Mule 实例中存


在多个模型。

<model name="mainSection" type="SEDA">


...
</model>

深入一个 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.1. Mule 配置概述

Mule 的配置是可扩展的,对 Mule 配置的存储方式及配置的格式没有任何要求。唯一的


要 求 是 当 Mule 被 配 置 之 后 , 一 个 UMOManager 的 实 例 必 须 可 能 通 过
UMOManager.getInstance()方法访问到。

快速开始
通过命令行或脚本来
1.1.2.2. 配置选项

1.1.2.3. 通过编程的方式配置 Mule

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

1.1.3.1. 在 java 应用中嵌入 Mule

在任何 JAVA 应用程序中配置 Mule,可以调用一个 ConfigurationBuilder。使用 Mule xml


configuration:

MuleConfigurationBuilder builder = new MuleXmlConfigurationBuilder();


UMOManager manager = builder.configure(“mule-main-config.xml,mule-component.xml”);

使用 Spring configuration:

SpringConfigurationBuilder builder = new SpringConfigurationBuilder();


UMOManager manager = builder.configure(“mule-config-main.xml,spring-component.xml”);

注意,可以使用多个用逗号分隔的配置文件,也可以使用一个单独的配置文件。

在应用程序中可以用 Mule Client 与 Mule 服务器交互:

//创建一个 Mule 客户端


MuleClient client = new MuleClient();

//异步发送一个 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.2. 在 web 应用中嵌入 Mule

在 WEB 应用中使用 Mule,需要在上下文参数中提供一个或多个配置文件,同时需要


配置一个 listener 来初始化 Mule 服务器。使用 Mule xml configuration:

<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>

上下文参数可以是类路径也可以是文件路径,同时也可以指定多个配置文件。

使用 spring configuration,可以用标准的 Spring 上下文监听器:

<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>

同样,上下文参数可以是类路径也可以是文件路径,多个文件用逗号分隔。

在 JSP 或 Servlet 中可以用 Mule Client 与 Mule 服务器交互:

//创建一个 Mule 客户端


MuleClient client = new MuleClient();

//异步发送一个 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.3. Profiling mule with YourKit

1.1.3.4. 编写组件

由于 Mule 组件可以是 POJO,新手一般不太清楚 Mule 是如何与其组件进行交互的。

Entry Points
组件接收事件之后,Mule 会执行 entry point 方法。当组件接收事件之后,Mule 根据事
件的 payload 类型动态选择调用的方法。这意味着你的组件可能有多个 entry point。事件的
payload 类型几乎总是由为组件接收事件的提供者的日入向转换器所决定,但是一些提供者
如 SOAP 提供者自己管理类型的映射,因此不需要转换器。

如果你的组件实现了 Mule 默认的事件接口 org.mule.umo.lifecycle.Callable,则直接使用


该接口的方法实现。

如果你需要调用组件的无参的方法,阅读“调用无参方法”章节。

Event Flow
对于进出组件的事件流的管理,Mule 有一些默认的行为规则。
1. 当一个事件被接收之后,Entrypoint 方法按照上面描述的方式被调用。
2. 响应或出向消息通过如下方式获得:
a) 如果调用的方法不是 void 类型的,使用方法的返回值。如果返回 null,对于
当前请求,没有需要后续处理。
b) 如果调用的方法是 void 类型,使用调用方法时的参数。假定参数本身不变,
并且没有对事件做任何改变。
3. 出向事件被按照组件配置自动路由:
a) 如果已经配置了一个出向路由器,则使用该路由器路由事件。
b) 如果只配置了一个出向端点,则使用该端点路由事件。
c) 如果配置了多个出向端点,则使用第一个端点路由事件。

定制行为
尽管默认的事件流行为是充分的,很多时候你可能希望在某些点上定制它。为了实现这
个目的,需要获取一个 org.mule.umo.UMOEventContext 的引用。有两种方式可以实现:

实现 org.mule.umo.lifecycle.Callable 接口。事件上下文作为一个参数被传递给该接口。

Public interface Callable


{
Public object onCall(UMOEventConetxt eventContext) throws Exception;
}

也可以通过 RequestContext 的静态方法获取:

UMOEventContext eventContext = RequestContext.getEventContext();

通过 EventConetxt,可以同步/异步的发送或接收事件、管理事务、重写默认的事件流行
为。例如:

UMOEventContext eventContext = RequestContext.getEventContext();


UMOEndpoint endpoint = new MuleEndpoint(“jms://localhost/topic:stock.quotes”);

Context.dispatchEvent(new MuleMessage(“IBM:0.01”,null) ,endpoint);

UMOMessage quote = context.receive(endpoint,5000);

尽管你使用 event context 改变了事件流,当你的方法返回后,Mule 会按照正常的方式


路由出向事件。可以通过如下两种方式停止 Mule 继续处理事件:

1. 如果你的服务方法不是 void 类型,则可以返回 null。该方式告诉 Mule 没有需要继


续处理的事件。
2. 如果你的服务方法是 void 类型的,Mule 会使用入向事件的 payload 作为出向事件
的 payload。如果不希望这样,可以调用如下方法:

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>元素上为组件配置异常策略:

<mule-descriptor name=”myComponent” implementation=”org.foo.MyComponent”>


……
<exception-strategy className=”org.mule.impl.DefaultComponentExceptionStrategy”/>
</mule-descriptor>

或者在 Model 上设置该模型管理的所有组件的公用策略:

<model name=”myModel”>
……
<exception-strategy className=”org.mule.impl.DefaultComponentExceptionStrategy”/>
……
</model>

除非某个组件上明确的设置了异常策略,否则该 Model 管理的所有组件都将使用该异


常策略。

可以在异常策略上配置一个端点,来将失败的事件发送到指定的目的地,例如一个错误
队列。Org.mule.impl.DefaultComponentExceptionStrategy 是一个默认的实现,可以配置一个
端点:

<mule-descriptor name=”myComponent” implementation=”org.foo.MyComponent”>


……
<exception-strategy className=”org.mule.impl.DefaultComponentExceptionStrategy”>
<endpoint address=”jms://error.queue”/>
</exception-strategy>
</mule-descriptor>

实现你自己的策略,可以继承 org.mule.impl.AbstractExceptionListener,尽管强烈建议继
承 org.mule.impl.DefaultComponentExceptionStrategy 并重写 defaultHandler()方法。可以向为
Mule 其他对象配置属性一样,使用<properties>元素为定制的异常策略配置属性:

<mule-descriptor name=”myComponent” implementation=”org.foo.MyComponent”>


……
<exception-strategy className=”org.mule.impl.DefaultComponentExceptionStrategy”>
<endpoint address=”jms://error.queue”/>
<properties>
<property name=”foo” value=”bar”/>
</properties>
</exception-strategy>
</mule-descriptor>

对异常进行所有的必要的处理是 defaultHandler()方法的责任。换句话说,任何时候都不
要让异常策略向外抛异常。即便是发生了致命的异常,异常策略也要把它处理掉。例如,使
用一个错误队列时异常事件派发失败了,你或许要停止当前的组件并触发一个服务器通知来
向监控系统告警并把事件写到文件中。

在某些情况下,你或许想要改变记录异常的方式。如果这样,你只能重写
AbstractExceptionListener 的 logException()方法。

连接器异常策略
可以通过同为组件配置异常策略一样的方式来为连接器配置异常策略:

<connector name=”tcpConnector” className=”org.mule.providers.tcp.TcpConnector”>


……
<exception-strategy className=”org.mule.impl.DefaultExceptionStrategy”/>
</connector>

最主要的不同就是连接器异常策略要处理的异常的类型。这些异常通常都与连接相关,
不确定是否能够被恢复。Org.mule.impl.DefaultExceptionStrategy 是连接器默认使用的异常策
略,该策略只是简单的记录异常并继续。
1.1.3.7. 国际化

1.1.3.8. Mule 端点 URIs

1.1.3.9. Mule 端点

1.1.3.10. 消息路由器

1.1.3.11. 事务管理

1.1.3.12. Mule 客户程序

1.1.3.13. Mule 代理程序

1.1.3.14. Mule 服务器通知

1.1.3.15. Mule 安全

1.1.3.16. 使用 Mule 进行快速开发

1.1.4. Mule 集成

1.1.4.1. 应用服务器

1.1.4.2. 对象容器

1.1.4.3. Java 网格

1.1.4.4. JSR-223 脚本语言(php、groovy、javascript)


1.1.4.5. JNDI

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.1. Mule IDE

1.1.5.2. Benchmark

1.1.5.3. 配置查看器

1.1.6. 建议阅读

1.2. 编程指南

1.2.1. 引言

本指南的目的是为开发 Mule 应用提供一种实用的方式。包括架设 Mule 应用的步骤


和最佳实践。

先决条件
本指南假设你已经理解了 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 消息的优先级。

如果底层的传输器支持附件(如 SOAP 或 Mail)


,这些信息将被放到 Mule 消息
的附件中。
端点
端点被用来从传输(transport)器接收消息。端点是配置好的对象,定义了 Mule 如何
接收和转换消息。你可以为端点配置地址、传输器特定的配置信息、事务和过滤器。更多信
息请阅读专门讲解端点的部分。

入向路由器
入向路由器控制发送给组件的事件流,可以重新排序、集合或过滤进入的消息。例如,
IdempotentReceiver 将拒绝任何已经收到的入向消息;CorrelationResequencer 将持有许多相
关的事件,并按照一定的顺序(基于这些事件被分发的顺序)交给组件。

元素 定制 编码需求
端点 端点是 Mule 传输器上的一个配 在 Mule 中,编写你自己的传输器是一
(入向) 置,引入一个新的端点意味着引 件繁重的劳动。然而,大多数工作都已
入一个新的传输器。你可以定制 经有抽象类完成,你只需要在模板方法
一个已有传输器的行为来改变其 中编写传输器特定的代码即可。
接收和分发消息的方式。
路由器 Mule 提供了很多标准的出向路由 只有类似 CorrelationAggregator 的路由
(入向) 器,不用定制就可以直接使用。 器需要定制,插入把多个事件聚合为一
需要定制的唯一原因就是当需要 个事件的逻辑。
一些定制的逻辑来处理类似聚合
一组事件的事情。

1.2.2.2. 组件流程阶段

组件流程在 Mule 消息传递到模型(服务容器)后开始。此处消息被传递给服务对象,


传递到服务对象之前,拦截器和转换器作为入向消息流程的一部分被调用。

拦截器(前置)
拦截器用于拦截到服务组件的消息流。它们可以用来触发监控和事件或者中断消息流,
例如认证拦截器可以确保当前请求拥有正确的凭证来调用服务。

入向转换器
入向转换器用于将入向消息从底层传输格式转换成服务组件需要的格式。转换器可以组
成链,应该被用于数据级别的转换,例如从一种数据类型/格式转换成其他形式。

复杂转换

需要访问外部数据源的高级转换,如压缩或查找数据,建议由服务
组件来执行该任务;转换器应该被用来做简单的数据转换处理。

服务引用
服务就是业务逻辑。可以是 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. 架构指南

本处所列的很多 Mule 特性都使用了和著名的《企业集成模式》一书相同的术语。该书


描述了 Mule 所要解决的问题,书写了很多 Mule 框架中使用的模式。

1.4.1. 引言

本文将深入 Mule 的架构。

1.4.2. 架构概述

最主要的目标是使应用之间能够使用标准的、协议开放和良好定义的模式进行集成。为
了达到这个目标,Mule 定义了很多组件来执行大多数必须的工作,使分离的应用和服务之
间可以交互。

下图显示了一个简单的点到点的拓扑结构,演示了 Mule 的组件如何组合起来协同工作。

应用
应用可以是任何种类,例如 WEB 应用、办公系统、应用服务器以及其他 Mule 实例等。

信道
可以是两点之间通信传输数据的任何方式。Mule 中使用信道将 UMO 组件连接起来,
同时也使用信道将跨本地网络或互联网的不同 Mule 节点连接起来。

EIP – Message Channel(消息信道)


Mule 没有实现或要求任何特殊的信道,但是 Mule 提供了很多 Transport 提
供者作为信道选择。

当一个应用有信息要通信的时候,并不仅仅是把消息扔到消息系统里,而是将消息添加
到一个特殊的消息信道上;接收消息的应用也并不仅仅是随机从消息系统中取出信息,而是
从一个特殊的消息信道上接收信息。

消息接收者
消息接收者负责从应用中读取或接收数据。在 Mule 中,接收者就是 Transport 提供者的
一个元素,Mule 提供了非常多的 Transport,例如:JMS、SOAP、HTTP、TCP、SMTP、FILE
等。

Mule 最大的魔力就是其在分离的系统之间通信的能力,业务逻辑(UMO 组件)甚至不


需要知道应用的位置、数据的格式、传输机制或者调用的协议。同样,当 UMO 组件完成处
理之后,不需要关心数据下一步到哪里或者需要什么样的数据格式。

EIP – Message Endpoint (消息端点)


Mule 透明的管理流经端点的数据的传递。

消息端点代码可以在应用程序和通信系统客户端 API 上定制。应用的其他部分在与另


外应用通信的过程中完全不知道消息的格式、信道、或者其他通信细节。它仅仅知道要向其
他应用发送数据,或者希望从其他应用获得数据。是通信终端代码将这些数据组装成消息,
并通过指定的信道进行发送。是端点接收一个消息并解析内容,然后以有意义的方式交给应
用。

入向路由器
入向路由器被用来控制关注某个通道的组件接收什么样的事件以及如何接收这些事件。
入向路由器可以被用来过滤、拆分、聚合、重新排序事件,在这些事件被 UMO 组件接收之
前。

连接器
连接器知道如何通过一个特定的通道发送和接收数据。一个消息接收器被结合在连接器
上,从连接器识别的资源注册感兴趣的数据。

转换器
转换器用于对消息/事件的 payload 进行类型转换。Mule 并没有定义一个标准的消息格
式(将来 Mule 可能会支持标准的业务处理定义消息类型)。转换器最直接的功能就是类型
转换,如将 JMS 消息转换成对象,或者对 XML 数据进行转换。数据转换与应用是紧密相
关的,Mule 提供了一个简单而又强大的转换框架。

端点
端点其实就是一个配置块,绑定了一个连接器、一个端点 URI、若干转换器、若干过滤
器和事务信息,提供了一个通道适配器。提供者将为其实例保存事务信息。

EIP – Channel Adapter (通道适配器)


一个提供者等价于通道适配器。

适配器担当了消息系统的通信客户端,通过应用指定的接口调用应用的功能。同时,通
道适配器可以监听应用内部的事件并调用消息系统对这些事件作出响应。

出向路由器
出向路由器将消息/事件发送到不同的提供者,依赖于事件的内容和其他配置好的规则。

1.4.3. Mule 管理器

Mule 管理器是 Mule 框架的核心。它负责管理所有核心服务及这些服务管理的组件的配


置。下图展示了组成 Mule 管理器的核心组件。

1.4.4. 模型

模型封装和管理一个 Mule 服务器实例的运行时行为。它负责管理 UMO 组件实例和其


配置。模型有三种控制机制来决定 Mule 如何与它的 UMO 组件进行交互。

Entry Point Resolver


进入点解释器用于决定当组件接收到事件时调用组件上的哪个方法,由
org.mule.umo.UMOEntryPointResolver 接口定义。如果在模型中没有其他的配置则使用默认
的 DynamicEntryPointResolver。DynamicEntryPointResolver 提供了通用的进入点解决方案,
其步骤如下:

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 生命周期接口。

很明显,这种机制不适合你想交给 Mule 管理的已有组件,这些组件很可能有他们自己


的 生 命 周 期 方 法 , 这 些 方 法 仍 然 需 要 被 Mule 框 架 调 用 。 很 幸 运 , 实 现
org.mule.umo.lifecycle.LifecycleAdapter 接口非常简单。

生命周期适配器由 orgm.mule.umo.lifecycle.UMOLifecycleAdapterFactory 接口的具体实


现来创建和配置。该工厂在模型的配置中声明。DefaultLifecycleAdapterFactory 是默认的实
现。

Component Pool Factory


模型的 component pool factory 属性定义了一个工厂,该工厂负责为一个给定的组件创
建组件池。该池用来池化 UMO 组件,如果需要的话,用户可以使用他们自己的池化机制。
Mule 提供了两个池化实现:

Commons-pool – 使用 jakarta common-pool 来管理池化的组件


Pico-pool – 这是一个 Pico 外部组件,通过 PicoContainer 管理池化组件

开 发 者 如 果 想 使 用 他 们 自 己 的 池 化 组 件 , 需 要 实 现
org.mule.umo.model.UMOPoolFactory 、 org.mule.util.ObjectPool 和
org.mule.util.ObjectFactory 三个接口。
1.4.5. Transport 提供者

Transport 提供者是一个 Mule 插件,使 Mule 组件可以通过特定的协议、技术发送/接收


事件。下图描述了 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 transport 提供者提供了可插拔的端点生成器,开发者可以进行定制。

端点解释
本 节 描 述 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.4.11. Mule 对象层级

1.5. 传送器指南

1.5.1. Mule 核心传送器

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

1.5.1.2. EJB Provider

1.5.1.3. Email Provider

1.5.1.4. File Provider

1.5.1.5. Ftp Provider

1.5.1.6. Http Provider

HTTP 连接器允许 Mule 通过 HTTP 协议发送/接收事件。还有一个 HTTPS 连接器,在


SSL 环境下使用。

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 端点,使用 HTTPS 端点必须在配置中声明一个连接器。HTTPS 连接器的


类是:org.mule.providers.http.HttpsConnector。

端点属性
任何 HTTP 响应头的值都可以作为端点属性。下面列出最常用的属性:
Property Description Default
http.status 响应的状态吗,如 200 代表请求成功。 200
Content-Type 消息载荷的类型。 Text/plain
Location 使用重定向时需要设置该属性,指明客户机重定向的地址。

下面是一个简单的例子,描述如何在端点上设置这些属性:

<endpoint address=”http://localhost:8080/mime” synchronous=”true”>


<properties>
<property name=”Content-Type” value=”text/html”/>
<property name=”Location” valule=”http://mule.codehaus.org”/>
<property name=”http.status” value=”307”/>
</properties>
</endpoint>

在这个例子中,消息载荷的类型是“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>

要使该安全过滤器起作用,需要在 Mule 实例上配置一个安全管理器。更多信息阅读“安


全管理器”部分。

发送凭证
要生成一个需要认证的 HTTP 请求,可以在端点上设置凭证,如下:

http://user:password@myCompany.com/secure

轮询 HTTP 服务
HTTP 传送器支持轮询一个 HTTP 地址,可以按如下方式配置 HTTP 轮询接收器:

<connector name=”pollingHttp” className=”org.mule.providers.http.HttpConnector”>


<properties>
<map name=”serviceOverrides”>
<property name=”message.receiver” value=”
Org.mule.providers.http.PoolingHttpMessageReceiver”/>
</map>
</properties>
</connector>

按如下方式在端点上使用该连接器:

http://company.com/service?connector=pollingHttp&pollingFrequence=30000

等价的端点配置如下:

<endpoint address=”http://company.com/service” connector=”pollingHttp”>


<properties>
<property name=”pollingFrequence” value=”30000”/>
</properties>
</endpoint>

转换器
可以使用的转换器列表:
Transformer Description
HttpClientMethodResponseToObject 将一个 HTTP 客户端响应转换成对象,特别地,一个
Mule 消息。
HttpResponseToString 将一个 HTTP 客户端响应转换成一个 String。
UMOMessageToResponse 将一个实现 UMOMessage 的对象转换成 HTTP 响应。

* 如果你在编写一个自己的转换器来改变 HTTP Post 请求的长度,千


万不要忘记设置正确的 Content-Length 消息头,或者干脆删除该消息头
(该消息头会自动被设置)。
处理 HTTP 内容类型和编码
发送 HTTP(Mule 1.3 RC2 之后)
此处对于 HTTP 请求主体和响应主体都适用。

如果我们有一个 String、char[]、Reader 或者其他类似的对象:

如果端点明确设置了编码,则使用该编码
否则从 Mule 消息的 Content-Type 属性获取
如果以上都没有,则使用 Mule 管理器的默认配置
对于内容类型,使用 Mule 消息的 Content-Type 属性
如果没有设置 Content-Type 属性,使用“text/plain”(或许是 XML)

对于二进制内容,不需要编码类型,按如下方式这是内容类型:

如果消息上设置了 Content-Type 属性,则使用它


如果消息上没有设置 Content-Type 属性,则使用“application/octet-stream”

接收 HTTP(Mule 1.3 RC2 之后)


此处对于接收 POST 请求(服务器)或者获取响应主体(客户端)都适用。

如果 Content-Type 消息头被接收:

设置消息 Content-Type 属性
对于文本内容(以“text”开始),使用指定的编码将 payload 解释成 String
如果没有设置编码,使用 ISO-8859-1 作为默认的 HTTP 文本内容编码类
型,除非在端点上明确地设置编码。

如果没有 Content-Type 消息头:

不设置 Content-Type 属性
将 payload 作为字节读入
1.5.1.7. Imap Provider

1.5.1.8. Jdbc Provider

1.5.1.9. JMS Provider

1.5.1.10. Multicast Provider

1.5.1.11. Pop3 Provider

1.5.1.12. Quartz Provider

1.5.1.13. Rmi Provider

1.5.1.14. Servlet Provider

1.5.1.15. Smtp Provider

1.5.1.16. Soap Provider

1.5.1.17. Ssl Provider

1.5.1.18. Stream Provider

1.5.1.19. Tcp Provider

1.5.1.20. Udp Provider

1.5.1.21. Vfs Provider


1.5.1.22. Vm Provider

VM 连接器用于在 Mule 所管理的组件之间进行 VM 内部通信。该连接器提供了选项来


配置瞬时的或持久的队列。

VM 连接器属性
Property Description Default Required
queueEvents 决定是否要为连接器上的监听器设置队列。如果设置 false No
为 false,连接器只是简单的通过 Mule 服务器把事件
发送给组件。不强迫设置给属性,如果设置为 true,
队列将根据 MuleConfiguration 被配置。可以在配置中
指定是否持久化队列。

使用 VM 队列
当使用异步 VM 端点时,事件在内存中从一个组件传递到另一个组件(异步端点引入
了一个事件队列,线程可以从该队列中消费事件)。然而,当“queueEvents”属性被设置后,
事件可以存储在内存中,随后由客户端或组件进行消费。此外,这些队列可以被持久化并支
持 XA 事务。

要想使用 VM 队列,必须在连接器上设置“queueEvents”属性。所有要使用队列的 VM
端点都必须使用激活“queueEvents”属性的 VM 连接器。不能在端点上设置“queueEvents”
属性,该属性只能在连接器级别设置。例如:

<connector name=”vmQueue” className=”org.mule.providers.vm.VMConnector”>


<properties>
<property name=”queueEvents” value=”true”/>
</properties>
</connector>

<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>

注意,上面的端点明确地告诉 Mule 使用“vmQueue”连接器。否则,Mule 会自动查找


第一个匹配该端点协议的连接器。

使用持久队列
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 队列拥有事务需要进行如下
配置:

<endpoint address=”vm://test.queue” connector=”vmQueue”>


<transaction action=”BEGIN_OR_JOIN” factory=”org.mule.vm.VMTransactionFactory”/>
</endpoint>

同时,需要在配置中增加一个事务管理器。更多信息阅读“事务管理器”部分。

端点
VM 端点是一个“资源”端点,仅仅命名了一个“资源”,不需要主机地址或其他配置。
例如:

Vm://myComponent

指向一个叫做“myComponent”的地址,任何监听 vm://myComponent 地址的组件都可以接


收到由 vm://myComponent 分发的事件。

使用 VM 队列的方式是一样的。

转换器
VM 传送器没有特殊的转换器。
1.5.1.23. WSDL Provider

1.5.1.24. Xmpp Provider

1.6. 技术文章

1.7. 发布指南

第三章. Mule 实战

第四章. 高级专题

You might also like