MEL语法学习笔记v.docx
《MEL语法学习笔记v.docx》由会员分享,可在线阅读,更多相关《MEL语法学习笔记v.docx(14页珍藏版)》请在冰豆网上搜索。
MEL语法学习笔记v
目录
一、MEL语法规则及定义2
1.1MEL(MuleExpressionLanguage)语法介绍2
1.2MEL上下文对象(ContextObjects)2
1.2.1Server3
1.2.2Mule4
1.2.3App5
1.2.4Message5
1.3MEL运算符6
1.3.1数学运算6
1.3.2比较运算6
1.3.3逻辑运算7
1.4MEL变量(Variables)8
1.5数据提取函数(DataExtractionFunctions)8
1.3字典、列表、数组(Map,List,andArray)9
二、MEL语法实践9
2.1消息过滤器(MessageFilters)9
2.2消息选择路由(ChoiceRouters)9
2.3消息转换器(ExpressionTransformers)10
2.4连接器(Connectors)10
2.5日志组件(Loggers)10
2.6动态端点(DynamicEndpoints)11
2.6表达式组件(ExpressionComponents)12
一、MEL语法规则及定义
1.1MEL(MuleExpressionLanguage)语法介绍
Mule表达式格式表现为:
#[] .
表达式语言类似于脚本语言,它允许你用精简的脚本动态实现取值、赋值、操作消息等。
如果你想实现更复杂的逻辑,那么建议采用脚本语言,如果你想快速简单的实现取值复制以及函数调用等操作,采用表达式语言更方便。
目前Mule支持两种表达式语言:
1.Mule3.3以前的版本,表达式格式表现如:
#[evaluator:
expression]
2.Mule3.3,MuleExpressionLanguage【MEL】,表达式格式表现如:
#[expression]
老版本和新版本的不同是,老版本需要指定Evaluator,而新版本就是MEL本身。
语法介绍:
表达式
描述
#[2+2]
该表达式取值等于4.
#[2+2==4]
该表达式为逻辑表达式,取值为true.
#[message]
该表达式引用了MEL中四个上下文对象中的message对象,该表达式取值为message对象的值。
四个上下文对象包括:
(message, app, mule,and server).具体对象参数介绍请见下文。
#[message.payload]
该表达式链接了message对象的payload属性。
#[message.payload['name']]
该表达式链接了message对象的payload属性中name变量中的值。
注意,name是由单引号括起来的,这是由于mule的配置文件采用的是双引号,所以这里只能使用单引号。
#[message.payload[4]]
同上一表达式一样,只是这里是通过数字索引来引用该值。
#[message.header.get()]
该表达式链接了message对象的header对象,并调用get方法。
1.2MEL上下文对象(ContextObjects)
Contextobjects包括消息对象以及它的环境变量。
MEL包括四个上下文对象:
Server:
包括硬件、操作系统、用户、网络接口等属性。
Mule:
包括Mule实例的所有属性。
App:
包括当前Mule应用的所有属性。
Message:
包括当前Mule消息的所有属性。
MEL中默认的上下文对象为message。
例如:
#[message.payload]可以写为:
#[payload],即省略了message对象。
MEL上下文对象属性地图:
server
mule
app
message
fileSeparator
clusterId
encoding
id
host
home
name
rootId
ip
nodeId
standalone
correlationId
locale
version
workdir
correlationSequence
javaVersion
registry
correlationGroupSize
javaVendor
replyTo
osName
dataType
osArch
payload
osVersion
inboundProperties
systemProperties
inboundAttachments
timeZone
outboundProperties
tmpDir
outboundAttachments
userName
exception
userHome
userDir
1.2.1Server
该对象的属性仅提供读取不能改写,包括硬件、操作系统、用户、网络接口等信息:
名称
描述
fileSeparator
文件路径分隔符("/"onUNIXand"\"onWindows)
host
服务器全名,如
ip
服务器IP地址
javaVendor
JRE供应商名称
javaVersion
JRE版本
locale
Defaultlocale(oftypejava.util.Locale)oftheJRE(canaccessserver.locale.languageandserver.locale.country)
osArch
操作系统架构
osName
操作系统名称
osVersion
操作系统版本
systemProperties
系统属性地图
timeZone
JRE默认时区
tmpDir
JRE临时目录
userDir
用户工作空间目录
userHome
用户主目录Userhomedirectory
userName
用户名
举例:
'server.userName'表示当前用户的名称。
1.2.2Mule
该对象的属性仅提供读取不能改写,包括Mule实例属性:
名称
描述
clusterId
ClusterID,集群ID
home
Mule服务器安装目录
nodeId
ClusternodeID,集群节点ID
version
Mule版本
1.2.3App
该对象的属性大部分仅能读取,部分可读可写:
Name
Description
encoding
默认编码Applicationdefaultencoding(只读)
name
应用名称(只读)
standalone
Mule是否单机独立服务器,是则返回True(只读)
workdir
应用工作目录Applicationworkdirectory(只读)
registry
当前Mule应用的变量注册地图MaprepresentingtheMuleregistry(可读可写)
举例:
'app.registry['foo']'代表注册在地图中的名称为foo的对象,可以取值或赋值。
1.2.4Message
ThisobjectprovidesaccesstothepropertiesoftheMulemessagelistedinthetable.Themeaningsofmostofthesepropertiesaredocumentedelsewhere,nothere.
Name
Description
id
(只读)
rootId
(只读)
correlationId
关联ID(只读)
correlationSequence
(只读)
correlationGroupSize
(只读)
replyTo
(可读可写)
dataType
(只读)
payload
消息负载(可读可写)
inboundProperties
Map(只读)
inboundAttachments
Map(只读)
outboundProperties
Map(可读可写)
outboundAttachments
Map(可读可写)
exception
(只读)
1.3MEL运算符
MEL运算符遵循标准JAVA语法,但是操作数都为值类型而非引用类型。
举例:
"A"=='A'返回true,,但同样的表达式在Java中返回false。
1.3.1数学运算
Symbol
Definition
Example/Value
+
加法。
.Fornumbers,thevalueisthesumofthevaluesoftheoperands.Forstrings,thevalueisthestringformedbyconcatenatingthevaluesoftheoperands.
2+4 6 'fu'+'bar' TheString"fubar"
-
减法。
Thevalueisthevalueofthefirstoperandminusthevalueofthesecond.
2-4 -2
/
除法。
Thevalueisthevalueofthefirstoperanddividedbythevalueofthesecond.
2/4 0.5
*
乘法。
Thevalueistheproductofthevaluesoftheoperands.
2*4 8
%
取余。
Thevalueistheremainderafterdividingthevalueofthefirstoperandbythevalueofthesecond.
9%4 1
1.3.2比较运算
Symbol
Definition
Example/Value
==
等于.Trueifandonlyif(iff)thevaluesoftheoperandsareequal.
'A'=='A' true
!
=
不等于.Trueiffthevaluesoftheoperandsareunequal.
'A'!
='B' true
>
大于。
Trueiffthevalueontheleftisgreaterthanthevalueontheright.
7>5 true
<
小于。
Trueiffthevalueontheleftislessthanthevalueontheright
5<5 false
>=
大于等于。
Trueiffthevalueontheleftisgreaterthanorequaltothevalueontheright.
5>=7 false
<=
小于等于。
Trueiffthevalueontheleftislessthanorequaltothevalueontheright.
5<=5 true
contains
包含。
Trueiffthestringontherightisasubstringofthestringontheleft.
'fubar'contains'bar' true
is, instanceof
类型判定。
Trueiftheobjectontheleftisaninstanceoftheclassontheright.
'fubar'isStringtrue
strsim
相似度,取值介于0到1之间,表示两个字符串之间的相似程度。
'foo'strsim'foo' 1.0 ‘foobar’strsim‘foo’ 0.5
soundslike
是否谐音。
如果两个字符串发音相似那么返回True。
(判断标准依据一种语音算法)
'Robert'soundslike'Rupert' true
1.3.3逻辑运算
Symbol
Definition
Example/Value
and
逻辑与.Trueifbothoperandsaretrue.(注意不要使用&&,因为可能与配置文件符号冲突)
(a==b)and(c!
=d) trueiffa=bandc≠d
||
逻辑或.。
至少有一个为真则返回True。
true||anything
Always true
or
ChainedOR。
从左到右遍历返回第一个不为空的对象。
falseor''or''or'dog'
TheString"dog"
1.4MEL变量(Variables)
除了MEL本地变量(作用区域仅限于当前消息执行器)外,MEL还提供两种变量:
流程变量flowVars、会话变量sessionVars。
变量名
说明
flowVars
作用区域为当前flow。
你可以在前一个消息执行器设置它的值,在下一个读取。
SessionVars
作用区域为当前会话。
基本与flowVars一样外,它还可以在flow之间通过MuleEndpoint进行传递。
示例:
flowVars['foo']=sessionVars['bar'],如果没有重名的本地变量,甚至可以直接使用foo或bar,解释器首先在flowVars寻找该变量,然后是sessionVars。
如果你不希望解释器自动寻找变量,可以在配置文件中加入以下配置:
1.5数据提取函数(DataExtractionFunctions)
名称
说明
Xpath
数据提取对象默认为payload,如xpath('/orders/order[0]');可以显示指定提取对象,如xpath('/orders/order[0]',message.inboundAttachment['order'])
Regex
返回匹配字符串。
如同Xpath,默认也是针对payload,也可以显示指定提取对象。
如:
regex(TBD,message.inboundAttachment['order'])
1.3字典、列表、数组(Map,List,andArray)
map:
[key1:
value1,key2:
value2,...];
list:
[item1,item2,...];
array:
{item1,item2,...},在JAVA中需要指定数组中元素的类型,但在MEL中是无类型的。
二、MEL语法实践
2.1消息过滤器(MessageFilters)
ExpressionFilter最简单的应用就是判断是否传递该消息还是忽略该消息。
例:
2.2消息选择路由(ChoiceRouters)
选择路由作用就是根据MEL表达式将消息导向正确的分支。
例:
2.3消息转换器(ExpressionTransformers)
消息转换器即根据表达式计算得结果赋予当前消息的payload属性。
例:
'"/>
2.4连接器(Connectors)
MEL表达式可以为连接器的参数或属性赋值,传递参数等。
例:
2.5日志组件(Loggers)
MEL表达式可以为Component提供消息参数等。
例:
2.6动态端点(DynamicEndpoints)
动态端点的含义是URI中含有MEL表达式的端点。
例:
注意:
此例中,#[]标识符中包含了一组表达式,通过“分号”间隔,第一个表达式给filename赋值,第二个表达式是一个JAVA方法调用。
2.6表达式组件(ExpressionComponents)
表达式组件通过MEL表达式实现赋值,设置变量等操作。
例:
三、其他高级应用
3.1注册Mule应用级对象
注册方法:
获取或者更新方法:
3.2对象作用域(ObjectScopes)
Mule中分为三种对象作用域:
Singleton:
单件,针对所有请求仅允许一个实例
Prototype:
原型,每一个请求一个实例
Pooled:
池对象,连接池对象,一次只能允许一个线程获取一个对象
Pooled对象相对于Prototype对象来说的优势是在于,有些对象的创建成本太高,可能会影响性能。
3.3配置模式(ConfigurationPatterns)
通过将消息执行块进行编排到流程中,Mule可以实现任何想实现的功能或业务流程。
Mule同时还包括配置模式的功能,每一种模式被设计来实现一个简单通用的功能。
当前有四种模式:
Øpattern:
bridge:
桥接模式
Øpattern:
simple-service :
简单服务模式
Øpattern:
validator 类似单向桥接,特殊的是它需要校验消息
Øpattern:
web-service-proxy:
Web服务代理模式