前一段一直在学习mule,了解一些发现这方面资源网上较少所以把自己所学的与大家分享,我主要是看mule的官网学习知识,我会持续更新这一专题的,希望能帮助到想入门的。
Mule studio
了解概况:
Mule译为文,骡子、倔强之人它的图标确实也与骡子有几分神似。Mule是一个以java为基础的企业服务总线(ESB),该集成平台允许开发者在遵循SOA服务导向式架构方法学下快速便捷的将不同应用程序连接在一起交换数据。可以忽略各个应用程序中使用的不同技术,使他们集成在一起。
Mule中的思想:
Flow:
流,也就是消息流是由接收消息,处理消息,为消息选择路径等一系列组件组成的。它是mule中的核心思想,十分重要。以下是一个简单flow的例子以及代码:
<flow name="Simple_Example_Flow1" doc:name="Simple_Example_Flow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" path="kittens"/>
<set-payload value="Kittens? Kittens!" doc:name="Set Payload"/>
<echo-component doc:name="Echo"/>
</flow>
具体细节后面会有讲的。
流中可以依据功能划分为三大类:
Message processor(消息处理器):对消息进行加工处理,如filter,transformer,router等。
Message source(消息源):flow开始的地方,接收消息进入流中,触发处理器,如:Inbound/Outbound Endpoints。
Component(组件):主要实现一些特殊的功能,mule studio中提供的完成不了的。
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程序运行。
在浏览器中打http://localhost:8081/任意字符,回车。就会在浏览器中出现该字符。
看一下xml配置文件:
<flow name="sudy_muleFlow1" doc:name="sudy_muleFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" doc:name="HTTP"/>
<echo-component doc:name="Echo"/>
</flow>
首先定义了一个流,命名为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,我们可以根据自己的需要定制表达式。<expression evaluator=”” 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 语法:
这是一个非常灵活的工具,你可以使用MEL完成各样的表达式,譬如:常量,简单的运算,操作复杂的数据结构或者调用对象的方法;你还可以使用它运算regex和xpath函数。
让我们再看几个简单的例子:
#[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 中提供了很多样式的已经封装好的转换器供我们使用,如果没有合适的我们也可以自己定义转换器。
通过<custom-transformer class=”” doc:name=””/>来引用定制的转换器。
自定义转换类可以继承抽象类AbstractMessageTransformer并覆盖其中:
Public Object transformerMessage(MuleMessage message,string outputEncoding)方法可以实现处理转换。参数为 消息message和输出编码。
例子:
<sub-flow name="subSubSonSingleUnit" doc:name="subSubSonSingleUnit">
<custom-transformer class="com.neusoft.nems3.esb.transformer.SonUnitTransfomer"
doc:name="Java"/>
<flow-ref name="subSubProtocolChoice" doc:name="Flow Reference"/>
<custom-transformer class="com.neusoft.nems3.esb.transformer.SonUnitTransfomerEnd" doc:name="Java"/>
</sub-flow>
这里定义了一个子流,其中有两个自定义的转换器和一个引用全局的流,过程是先经过SonUnitTransfomer转换处理,消息再流入subSubProtocolChoice流,流出之后再由SonUnitTransfomerEnd转换器处理消息
Filtes(过滤器):
顾名思义,就是过滤掉不需要的信息,保留需要的信息。Mule同样为我们提供了多样已经封装好的过滤器。有异常过滤器,表达式过滤器,信息属性过滤器,负载过滤器,引用全局过滤器。
Flow control(路径控制):
用来控制信息流的流向,这里有Splitter将信息根据条件拆分,并发送给相应的后续处理,All,Choice是将信息全部发送或者根据条件有选择的发送出去,还提供了很多路径控制方案。
Error handling(错误处理):
这里有捕获异常策略,选择异常策略,引用全局的异常策略,以及回滚异常策略
Cloud connectors(云端连接器):
用来将mule application部署在云端。
基础知识:
我们已经简单的过了一遍各个分类中的元素,现在我们开始通过一个较完整的例子。
开始前还要先了解一下,配置文件的基本知识,整个xml配置文件是依据xml Schemae语法规则,整个文件中使用的标签需要在最上面引用命名空间。xml根节点是<mule></mule>
里面的标签都是闭合的,如果某标签中不含其它标签可以直接闭合如<flow/>。在<mule>中最上面可以通过<configuration></configuration>配置整个程序的配置信息。Mule xml实际是spring xml文件的扩张,所以你可以在这里使用spring的功能,例如配置一些bean,如果你有很多配置文件可以引入到一起。如:
<spring:beans>
<spring:bean id="configBean" class="com.neusoft.common.customized.CustomizedPropertyConfigurer" name="Bean">
<spring:property name="locations">
<spring:list>
<spring:value>classpath:error.properties</spring:value>
<spring:value>classpath:sql.properties</spring:value>
<spring:value>classpath:security.properties</spring:value>
<spring:value>classpath:protocol.properties</spring:value>
<spring:value>classpath:commonKey.properties</spring:value>
</spring:list>
</spring:property>
</spring:bean>
<spring:bean id="Spring_Util" class="com.neusoft.nems3.esb.util.SpringContextUtil" name="Bean1"/>
<spring:import resource="classpath:applicationContext.xml" />
</spring:beans>
Xml编辑器中:绿色代表节点元素、紫色代表节点属性、蓝色代表属性值。