MEL的中文总结
MEL即Mule Expression Language
Mule表达式提供了一系列消息处理方法包括:访问,操作和使用消息流信息;作用范围为xml应用,应用配置文件和部分java程序。
MEL语法
l Mule表达式就是零个或多个操作符连接一个或多个操作数据,类似java的语法,然后返回一个值,例如:2 +2返回4。
l Mule表达式的核心就是属性表达式。它可以轻松的访问mule消息和环境中的属性。比如:message. Payload即代码可以拿到消息流中的payload。
l 此外Mule表达式可以调用java方法并赋值(Math. random()返回一个随机数)。
l 大多数情况下,Mule表达式作为消息处理流中独立的配置属性,mule在运行时计算出结果给消息处理块使用。
l MEL很大程度上遵循java语法。但是MEL通过运行时强制转换实现动态类型。Mel表达式一般要求以分号结尾,但是不需要return。
属性表达式
即通过 contentObject. property的方法取出流程或者其它上下文对象中的值,如:#[app['ip']]。
方法调用
即通过这种方法取出需要的值:message.payload.getName(); System.currentTimeMillis();
MEL操作数
Mule操作数可以是文字,map,list,array,MEL表达式,流变量等。
MEL操作符
MEL的操作数类型如果是String型的话,在进行相等比较时以值相等的形式进行计算,当然如果使用java的方法来操作则;
算术运算符
其中包括:+、-、*、/、%;
比较运算符
其中包括:==、!=、>、<、>=、<=、contains、is、instance of、strsim、soundlike;
逻辑运算符
其中包括:and、||、or;
MEL赋值
关于mule表达式的赋值,这里列举一些例子:
Message. Payload = ‘1’;
由于MEL属于动态类型,所以:
Number = 1;实际上:number == ‘1’;的值是true;
也可以进行类型强制转换,如:
Number = (String)1;实际上:Number is String返回true;
MEL Literals
Literals 可以以string,number,Boolean value,types 和null值在mule表达式中出现。
作为number类型出现时,需要根据具体情况转换成十进制,八进制,十六进制等。
作为String型时,则需要考虑转义字符,如:
作为types时,则表达它可以代表一个完全路径的java类,或者默认已经引入的java类。
此外,MEL还支持条件表达式。
MEL 上下文对象
Mule上下文对象包括:
l Server: properties of the hardware, operating system, user, and network interface.
l Mule: properties of the Mule instance.
l App: properties of the Mule application.
l Message: properties of the Mule message.
其中Server和Mule中的值是只读的。后两者中部分是只读,部分可读写。
对消息中property的操作
message.outboundProperties.remove(“key”);移除消息中的内容;
message.outboundProperties['dog'] =””;给消息中的变量赋值;
变量
对于本地变量,其有效范围是当前消息处理者,MEL提供对流变量和session变量的访问通过flowVars和sessionVars;如:
flowVars['foo'] = sessionVars['bar'];
两种数据抽取
这两种数据抽取方式分别是:xpath和regEx;
Xpath的抽取模式包括:
xpath(x PathExpression, xmlElement);
regex(regularExpression);
例如:
regex('^(To|From|Cc):');
xpath('/orders/order[0]', message.inboundAttachment['order']);
regEx的抽取模式包括:
regex(regularExpression, melExpression);
xpath('/orders/order[0]', message.inboundAttachment['order']);regex(regularExpression, melExpression, matchFlags);
例如:
regex('^(To|From|Cc):');
{{regex(TBD, message.inboundAttachment['order'])}};
MEL中已自动引入的类型
java.lang.*
java.io.*
java.net.
*
java.util.*
java.math.BigDecimal
java.math.BigInteger
javax.activation.DataHandler
javax.activation.MimeType
java.util.regex.Pattern
org.mule.api.transformer.DataType
org.mule.transformer.types.DataTypeFactory
MEL备忘单
Server, Mule, Application, Message变量
我们可以创建一个文件路径作为当前的payload如:
Create a directory named target in the system's temporary directory and set it as the current payload:
|
<expression-component> targetDir = new java.io.File(server.tmpDir, 'target'); targetDir.mkdir(); payload = targetDir </expression-component> |
运行时使用入站信息来设置用户名和密码:
|
<https:outbound-endpoint address="https://#[message.inboundProperties.username]:#[message.inboundProperties.password]@api.acme.com/v1/users" /> |
Flow变量和Session变量:
关于流变量和session变量的描述:
“Flow variables are available in the flowVars context or directly as top level variables (unless autoResolveVariables is false or their name violates the MVEL naming conventions). Session variables are available in the sessionVars context.”
如下两种方式来设置session变量,变量名为sessionId;值为message的id + @ + mule.nodeId:
|
<set-session-variable variableName="sessionId" value="#[message.id+'@'+mule.nodeId]" /> <expression-component>sessionVars.sessionId = message.id+'@'+mule.nodeId;</expression-component> |
再列一例:
|
<set-variable variableName="beanName" value="#[message.payload.targetService+'Processor']" /> <set-variable variableName="bean" value="#[app.registry[beanName]]" /> |
Payload和attachment
把payload赋值给一个flow变量然后再恢复:
|
<set-variable variableName="originalPayload" value="#[message.payload]" /> <set-payload value="#[originalPayload]" /> |
一些例子:
支持正则表达式
语法:regEx(regularExpression [, melExpression [, matchFlags]]);
例如:regex('^(To|From|Cc):');
支持Xpath
语法:xpath(xPathExpression [, xmlElement]);
例如:
#[xpath('//title').text];
#[xpath('//title/@id').value];
Json处理
MEL没有对Json的直觉支持,一般使用Json-to-object-transformer将Json转换成简单对象然后其处理或应用;
|
<json:json-to-object-transformer returnClass="java.lang.Object" /> <expression-transformer expression='#[($.price in message.payload if $.title =='Moby Dick')[0]]" /> |
More MVEL Goodness
下边是一些例子:
关于MEVL参考:http://mvel.codehaus.org/Language+Guide+for+2.0
全局配置
可以在global configuration element中定义全局引入,别名和函数,全局函数可以从system、URL、或者classpath resource中load;流变量自动绑定可以通过autoResolveVariables属性关闭;
<configuration>
<expression-language autoResolveVariables="false">
<import class="org.mule.util.StringUtils" />
<import name="rsu" class="org.apache.commons.lang.RandomStringUtils" />
<alias name="appName" expression="app.name" />
<global-functions file="extraFunctions.mvel">
def reversePayload() { StringUtils.reverse(payload) }
def randomString(size) { rsu.randomAlphanumeric(size) }
</global-functions>
</expression-language>
</configuration>
MEL的日期和时间函数
获取服务器时间
语法:#[server.dateTime]
结果:'2013-12-27T14:24:23.730+08:00'
语法:#[server.nanoTime()]
结果:'364321452369748'
下边一些例子给出了传入参数的类型以及在流程中的使用实例;
获取时间中的部分信息
等类似方法很多;
修改时间
时间比较
关于时间区域的方法
String格式化
时间转换
非MEL表达式
此表达式语言不被推荐使用,属于mule3.3以前的使用方式;
通过transformer实现Expression
包括:expression transformer、message property transformer、XSLT transformer;具体参见:
http://www.mulesoft.org/documentation/display/current/Using+Non-MEL+Expressions
Expression Filter
例如:
<expression-filter evaluator="header" expression="my-header!=null"/>
<and-filter>
<expression-filter evaluator="header" expression="origin-country=USA"/>
<expression-filter evaluator="groovy" expression="payload.purchase.amount > 10000"/>
</and-filter>
创建Non-MEL Expression Evaluator
除了Mule ESB提供的evaluator外,还可以创建自己的evaluator;
第一步:
创建一个class实现类ExpressionEvaluator;
|
public interface ExpressionEvaluator extends NamedObject { Object evaluate(String expression, MuleMessage message); } |
现实类如下:
|
public class MessageHeaderExpressionEvaluator implements ExpressionEvaluator { public static final String NAME = "myEval";
public Object evaluate(String expression, MuleMessage message) { Object result = null; boolean required;
//Is the header optional? the '*' denotes optional if (expression.endsWith("*")) { expression = expression.substring(expression.length() - 1); required = false; } else { required = true; }
//Look up the property on the message result = message.getProperty(expression);
if (result == null && required) { throw new RequiredValueException(CoreMessages.expressionEvaluatorReturnedNull(NAME, expression)); } return result; }
public String getName() { return NAME; }
public void setName(String name) { throw new UnsupportedOperationException("setName"); } } |
第二步:注册定义好的Evaluator,有两种方式可以使用;
其一是配置成一个Java bean;
其二是Bootstrapping:
第二步:使用自定义的Evaluator;

浙公网安备 33010602011771号