本篇主要介绍Mule表达式语言,Mule Expression Language,简称MEL。MEL是一种轻量级,在Mule ESB使用的表达式语言,可用于访问和计算Mule Message的Payload,Property和Variable。几乎每个Mule组件均可以使用MEL表达式。MEL表达式可以帮助开发者高效和优雅地过滤,路由,处理Mule message。关于Mule message基本概念,请参考第二篇和第三篇文章。java
Mule ESB是一个使用Java语言,基于Spring框架编写的开源企业服务总线,其相关源代码托管在GitHub上。企业服务总线英文Enterprise Service Bus,简称ESB。node
MuleESB在众多开源的ESB中处于领先者的地位,拥有来自世界各地数十万个开发人员,超过数百万的下载量。MuleSoft公司也做为开源软件中的独角兽,2017年在纽交所成功上市。咱们做为MuleSoft的重要合做伙伴也参与其中,在六年多的时间里,使用Mule ESB企业版开发,或者Mule ESB社区版开发,构建了众多Mule ESB实施案例,帮助国内众多的企业成功上线企业集成项目。git
咱们使用Mule ESB开发的过程当中,体会到它优秀的架构设计和高效的开发速度。同时也深感Mule ESB开发书籍,Mule ESB中文文档资料很是稀少,因此使用8篇文章来写基础Mule ESB开发教程,讲解如何使用Mule ESB开发。github
在Mule ESB上有不少方法能够操做Mule Message,好比Java语言或者其余脚本语言(好比JavaScript等)。可是MEL表达式是Mule推荐使用,在Mule应用中的一个统一和标准的方法。express
MEL的示例,这个示例在在Mule的Logger组件中使用MEL表达式获取FlowVars。编程
从下图能够看到,咱们在Logger组件中使用MEL表达式,可以提供语法提示,该提示带出了上一步设定的customerNo变量。数组
XML配置以下:安全
<flow name="mel-flow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/> <set-variable variableName="customerNo" value="#[1008]" doc:name="customerNo"/> <logger message="The customerNo is #[flowVars.customerNo]" level="INFO" doc:name="Logger"/> </flow>
注意:MEL是一种表达式,和脚本语言相似,但并不相同。表达式一般用于动态获取值或者设定值,或对数据进行简单的操做。表达式语言和脚本语言之间在功能上存在重叠,但若是您编写的内容很是复杂,须要的不只仅是几行代码,或者您须要包含条件逻辑,那么脚本语言一般会更有用。若是简单的获取或设定值,调用方法或执行函数,则使用表达式则更方便。服务器
MEL表达式经常使用的使用场景大概能够分红三种。
#[payload]
#[message.inboundProperties.'http.query.params'.customerNo]
#[payload.callMethod(parameters)
#[xpath('//root/element')]
#[payload.amount > 2000]
#[message.inboundProperties.'http.method' == 'GET']
#[flowVars.dbResult]
使用表达式提取值,根据消息的内容,属性决定执行流程。在下面的示例中,payload是一个Java对象,咱们根据购买类型,将订单分发路由到不一样的JMS消息队列中。
<choice> <when expression="#[payload.getOrderType() == 'book']"> <jms:outbound-endpoint queue="bookQueue" /> </when> <when expression="#[payload.getOrderType() == 'music']"> <jms:outbound-endpoint queue="musicQueue" /> </when> </choice>
使用表达式提取值,并将值传递给Connector,以下示例就是使用MEL计算的值设定SMTP Connector的邮件标题,邮件接收人等。
<smtp:outbound-endpoint from="#[flowVars.mailFrom]" to="#[flowVars.mailTo]" subject="#[payload.mailSubject]" doc:name="SMTP"/>
若是payload是Java对象,能够调用payload方法,获取方法的返回值。示例就说调用calAmount方法,并打印计算出来的金额。
<logger message="#[payload.calAmount()]" />
咱们在上述的MEL表达式示例中能够看到MEL有多个部分组成,第一部分就是上下文对象。MEL常见的上下文对象以下:
上下文对象 | 说明 |
---|---|
#[server] | 当前服务器,能够获取服务器的时间,JDK版本等,如#[server.dateTime],#[server.javaVersion] |
#[mule] | 当前Mule实例,能够获取Mule的版本,目录等。如#[mule.version] |
#[app] | 当前Mule应用的实例,能够获取应用的名称等。如#[app.name] |
#[message] | 这个是咱们最常用的对象,就说Mule message。如#[message.payload],#[message.inboundProperties.'http.query.params'.customerNo]等 |
server上下文对象的经常使用属性:
Field | Field描述 |
---|---|
dateTime | 系统当前时间 |
host | 主机名 |
ip | 主机IP |
osName | 操做系统名称 |
userName | 当前用户 |
userDir | 当前用户工做目录 |
mule上下文对象的经常使用属性:
Field | Field描述 |
---|---|
home | Mule Runtime的安装目录 |
version | Mule Runtime的版本 |
nodeId | 集群下的本机ID |
clusterId | 集群ID |
app上下文对象的经常使用属性:
Field | Field描述 |
---|---|
name | Mule App应用名称 |
workdir | Mule App工做目录 |
message上下文对象的经常使用属性:
Field | Field描述 |
---|---|
id | message的惟一ID |
rootId | message的根ID |
payload | message的负载 |
inboundProperties | message的inbound头信息 |
inboundAttachments | message的inbound附件信息 |
outboundProperties | message的outbound头信息 |
outboundAttachments | message的outbound附件信息 |
不一样于第4点提到的上下文对象,MEL中还可使用变量,使用变量并不要求在表达式中使用上下文对象。变量是顶层的标识符。MEL中常见的变量以下:
#[flowVars.foo = sessionVars.bar]
上述的表达式的意思是,将session变量赋值给flow变量。
点语法。适用对象一般是Java Pojo。MEL中可使用点语法来访问相关的对象属性,一样对象属性的属性也是能够用点号来访问的。
#[message.payload.item.name]
Null安全性访问。Java编程中常常遇到NullPointerException错误,也就是说对空对象进行访问操做会报错。而在MEL表达式,能够经过点语法.?来避免出错。以下示例,即便item为null,该表达式仍然不会报错,它会返回null值。
#[message.payload.?item.name]
属性名称的转义。若是属性名称有特殊字符,那么使用点语法会遇到问题,这个时候能够单引号进行转义。以下示例,http.query.params是一个总体。咱们访问这个属性名,必须使用单引号进行转义。
#[message.inboundProperties.'http.query.params'.customerNo]
中括号语法。若是对象是数组,或者Map,那么可使用中括号进行访问
#[payload[5]]
#[payload['userName']]
经常使用的操做符以下,和普通的开发语言相似。还有更多的操做符能够查阅官方手册。
本文同步发文于EnjoyingSoft Blogs ,CSDN,简书
访问EnjoyingSoft 网站,获取更多Mule ESB 社区版 实施帮助。
欢迎转载,但必须保留原文和此段声明,且在文章页面明显位置给出原文连接,不然保留追究法律责任的权利。