Mule中的思想:
Flow:
Mule Message:
消息,是通过整个应用程序可能流经很多flow。它有两个重要的组成部分:
Message header:包含该消息的基本的元数据。元数据是由属性(properties)和变量(variables)组成,元数据可以为我们提供有用的信息,譬如告诉我们这个消息去向哪里。元数据都有一个特定的范围来规定它的生命周期。
属性(properties)的范围有两种:
Inbound properties:在消息源头被创建,不能被用户设置和修改。
Outbound properties:可以被用户配置,outbound属性如果随着一个message从一个Flow的outbound endpoint(出口端)流近另一个Flow的Inbound endpoint(入口端)可以变成Inbound properties。在一些特殊情况,如新的Flow是flow-ref而不是transport的话,范围还是没有改变。
变量(variables)是用户自定义的元数据,也有两种范围:
Flow variables:仅存在当前flow中。
Session variables:存在这应用程序中。
Message payload:是你真正要在应用程序中传输的数据,消息头中的元数据只是起到更好的表明要传输的数据,而payload才是你真正要传输的数据。
工作环境:
Canvas:是用来布局各个组件的,你可以在右上角搜索需要的组件名或者根据分类查找。
下面可以切换三种视图,message flow:就是当前视图、global elements:定义的全局元素、configuration xml:xml编辑的视图。
Package explorer:flows文件中存放的.mflow文件,就是canvas中显示的文件。
Outline:缩略图。Console:控制平台。
全局元素:
你可以定义元素为全局的,这样可以在多处调用,定义全局有两种方法,一种在global elements中直接添加一个,选择你要添加的元素以及相应属性。另一种是在xml编辑环境编写。Note:全局元素要有name属性,这样才可以被别处调用。通过<元素名-ref name=””>标签被调用。
Visual editor(视图编辑):
中间是画布,用来将各种元素拖拽到这里布局配置,右侧是提供的各个元素,分成了八类,依次是Endpoints, Scopes, Components, Transformers, Filters, Flow control, Error handling, Cloud connectors。如果你想使用哪个元素,直接拖拽到画布上,双击即可以打开配置面板,配置相应属性。
以下会分开讲各类元素功能以及相应配置,视图编辑和xml编辑在一起讲,最后会有综合在一起的例子。
Endpoints(端点):
用来接收和发送数据,负责连接外部资源并发送数据。分为Inbound endpoints输入端点,Outbound endpoints输出端点。端点需要关联一个connector连接器完成输入输出。如果没有配置连接器系统会默认配置一个。
我们创建一个例子,右侧拖拽一个http端点到画布上,再在filter上搜索echo,找到在components中,拖拽跟http端点放在一起。Echo是一个输出组件,如图:
双击http端点,出现配置面板如图。
这里有五个选项标签,
General中可以配置显示名称,默认为http。
信息交换模式,有one-way和request-response。单向和请求响应。
Host,port,path等。
Advanced中http outbound在这里会比inbound多一个是否重定向的选项。
我们什么也不需要配置,直接ok.
右键点击flows文件夹中mflow文件,选择作为mule application程序运行。
首先定义了一个流,命名为sudy_muleFlow1,显示名为sudy_muleFlow1。在流中我们首先定义了一个http的inbound-endpoint,设置了交换模式为请求-响应,主机为localhost,端口号为8081,显示名为HTTP。接着是输出组件echo。这就构成了一个最基本的流。这里没有定义连接器,系统会提供一个默认的给它。
Scopes(范围):
可以理解为用这里的元素可以将某一些元素规划成一个整体,一个系统分成各个组成部分。这里有Async(异步),flow(流),foreach(循环),sub-flow(子流)等。
Components(组件):
用来处理一些特殊的业务逻辑的元素,当你想将传来的消息message,进行特定的处理,筛选,都可以使用这里的组件。Echo就是在这里分类里。Expression表达式,是一个很有用的元素。这里支持很多语言,script,python,ruby,groovy等等。
这里要细讲下expression,我们可以根据自己的需要定制表达式。之后通过语法#[evaluator:expression ]调用,但这是mule 3.3以前的版本要求的了。现在可以直接#[expression]调用,默认调用的是Mule Expression Language(MEL).下面给几个例子,感受下expression的作用。
获得当前消息message中需要的信息:
#[message.payload]
#[message.inboundProperties[‘propertyName’]]
给信息赋值
#[message.payload=’A information’]
#[message.outboundProperties[‘Authorization’]=Base64.encode(‘username password’)]
MEL语法:
#[2+2] |
这表达式值就是4
|
#[2+2==4]
|
这个表达式值为true |
#[message] |
这个涉及到四大context object(message, app, mule, server)之一,值为message |
#[message.id] |
这个message的id,它是唯一的 |
#[message.payload[‘name’]] |
Payload中key是name的值 |
#[message.header.get()] |
调用header中的get()方法 |
看过这些例子是不是已经感觉到expression的强大了?如果平时你需要的就在上面的话,就可以到此为止了,或者想更深入的了解这里,可以直接去官网看英文的也是个不错的选择,
http://www.mulesoft.org/documentation/display/current/Mule+Expression+Language+MEL,这是官方的解释。
我们在上一个例子中再加入一个expression,表达式中写成#[message.payload='hello world!'],如图:
再次运行,在浏览器中输入http://localhost:8081/任意字符,在浏览器中显示的都是hello world!。
Transformers(转换器):
在消息传输过程中,各元素可能接受数据的格式不同,我们需要将数据转换到元素希望接受的格式,这个时候我们就要用上转换器了。Mule中提供了很多样式的已经封装好的转换器供我们使用,如果没有合适的我们也可以自己定义转换器。
通过来引用定制的转换器。
自定义转换类可以继承抽象类AbstractMessageTransformer并覆盖其中:
Public Object transformerMessage(MuleMessage message,string outputEncoding)方法可以实现处理转换。参数为 消息message和输出编码。
顾名思义,就是过滤掉不需要的信息,保留需要的信息。Mule同样为我们提供了多样已经封装好的过滤器。有异常过滤器,表达式过滤器,信息属性过滤器,负载过滤器,引用全局过滤器。
Flow control(路径控制):
用来控制信息流的流向,这里有Splitter将信息根据条件拆分,并发送给相应的后续处理,All,Choice是将信息全部发送或者根据条件有选择的发送出去,还提供了很多路径控制方案。
Error handling(错误处理):
这里有捕获异常策略,选择异常策略,引用全局的异常策略,以及回滚异常策略
Cloud connectors(云端连接器):
用来将mule application部署在云端。
基础知识:
我们已经简单的过了一遍各个分类中的元素,现在我们开始通过一个较完整的例子。
开始前还要先了解一下,配置文件的基本知识,整个xml配置文件是依据xml Schemae语法规则,整个文件中使用的标签需要在最上面引用命名空间。xml根节点是
关于Mule ESB,简单来说Mule接受一个消息,按照某种顺序处理这个消息,这样的处理可导致多种结果。
有时,Mule改变或变换消息返回到原来的消息来源(request-response)。
或者,在其原有的基础上改变形式发送到一个或多个第三方(router, transfer)。
而在其他一些情况下,如果消息没有达到的具体要求,Mule可以拒绝处理的消息(validation, throttling)。
Mule 从3.0开始采用 flow 为单元的配置方式控制消息流(Mule 2.x 中使用
就像一个管道,消息从一端流向另一端。
流动的消息,在 Mule 里被定义为 MuleMessage,它的结构就像下面这个样子:
1. header(消息头):按照范围划分的属性;
2. payload(消息体);
3. attachments(附件)。
我们可以在 flow blocks 中,通过编程方式读取或者设置这些内容。
在 Mule 开发中,会遇到一个概念:"transport barrier" (传输障碍)。比如:调用子流程没有“transport barrier",而跨端点则需要跨越"transport barrier"。