mule in action翻译12 : 2.4 使用Mule表达式语言
2.4 使用Mule表达式语言
mule表达式语言带来了配置的动态性。mule提供丰富的表达式语言,
供你在配置文件的不同地方处理复杂逻辑。
表达式重载 mule表达式计算框架在 version3.3 进行了大改进。
形式如 #[evaluator:expression] ,
需要两个参数(expression和evaluator)的老语法已经过时, 本书现统一使用新语法。
mule表达式语言 ,也称为MEL,是基于MVFLEX表达式语言的(MVEL),它的编程功能齐全,
mule特有的变量和函数也丰富了它的功能。
你可以在线获取MEL的完整文档,所以这里我们只是泛泛的讲一下一般性的知识。
(你也可查看附录获取更多细节)
你可以使用MEL 做如下的事情:
1、使用classpath 下的可用的java类
2、方便的对list、map、array以及bean的属性进行导航式访问
3、表达复杂的逻辑,包含三元表达式。
4、定义本地变量,并以声明方式使用它。
mule绑定了一系列顶层的对象,作为访问mule执行时上下文的入口,
这也是当前消息的上下文入口。
现在,有四个上下文对象可用:
1、server --包含硬件、操作系统、用户及网络接口的属性消息,例如 server.ip
2、mule --mule实例的属性信息,例如 mule.version
3、app --进行mule表达式计算的mule应用。
4、message--当前正在处理的消息,例如 message.correlationId 或 message.payload
mule也提供了帮助方法作为计算上下文的成员.当前有两个可用的帮助方法:
1、xpath--可方便的从payload的XML或别的MEL表达式中提取值,例如xpath('/orders/order[0]')
2、regex--返回匹配payload或别的MEL表达式的数组,例如 regex('^(TO|From|Cc):')
扩展MEL 为了定义定制导入、可重用的函数或全局别名可以扩展MEL。更多消息参考附录A,的A.2部分。
可以在相同的表达式中放置多个声明,但要使用分号隔开。
最后一个声明的的值将将作为整个表达式的值。
例如, 计算下面的表达式:
targetDir = new java.io.File(server.tmpDir, 'target');
targetDir.mkdir();
targetDir
将返回java.io.File 类型的targetDir。
建议在在xml配置中,在任何属性中使用表达式时用方括号 #[] 把在表达式括起来。
下例中没有使用方括号,但也能正常使用;
<when expression="message.inboundProperties['valid']">
但建议写成:
<when expression="#[message.inboundProperties['valid']]">
这不适用于表达式组件,因为其中的 #[]会被忽略。
2.4.1 使用表达式
在xml配置文件中,表达式几乎可以用在所有的要求返回字符串的地方。
因为表达式是在运行时进行计算的--当消息流经mule时,
所以 既要使用当前消息又要使用到mule启动时读取的值(比如mule必须绑定的一个端口)的表达式
你是不能使用的。
列表2.14显示了怎样使用java.util.UUID动态的创建事务ID,并把它传递到XSLT转换器。
Listing 2.14 Using an expression to create a dynamic XSLT parameter
<mulexml:xslt-transformer xsl-file="to_payment_processor_call.xsl"> <mulexml:context-property key="transactionId" value="#[java.util.UUID.randomUUID().toString()]" /> </mulexml:xslt-transformer>
消息处理器会公平的使用表达式。在4.3.5,我们会讨论message enricher,
一个严重依赖表达式的消息处理器。另外一个依赖于表达式的消息处理器是logger。
看列表2.15 中是怎样使用xpath记录发票ID的。
注意 通过简写的 bean属性 value会调用 getValue()方法。
Listing 2.15 Logging a value extracted with XPath
<logger message="#[xpath('/invoice/@id').value]" category="com.prancingdonkey.service.Invoice.id" level="INFO" />
使用表达式较多的另外一种方式是作为路由的逻辑条件,像选择路由和过滤器路由。
true 或 false 条件判断中可以使用MEL的布尔型返回值。
String类型的值可以用来进行布尔计算,但我们更倾向于返回布尔型的值。
6.2节中讨论的配置patterns,为了使配置更简明也会使用较多的表达式。
列表2.16 展示了一个验证pattern,它使用简单的字符串表示接受还是拒绝消息。
它也使用表达式检查当前消息是否有附件。
Listing 2.16 The validator configuration pattern heavily relies on expressions.
<pattern:validator name="ensureAttached" inboundAddress="vm://ensure.attached" outboundAddress="vm://valid.request.handler" ackExpression="#['OK']" nackExpression="#['ERROR: no attachment!']"> <expression-filter expression="#[!(message.inboundAttachments.empty)]" /> </pattern:validator>
表达式也可以用用来进行endpoint的配置。
列表2.17 展示了一个允许动态取回股票市场历史数据。
这个流接收 股票代码标识符 作为payload,但他收到的不是
java.lang.String类型的(而是byte[]). 替代方案是,在构建HTTP patch前它使用一个payload 求值器
取出当前的payload内容,并把它转换成java.lang.String 。
Listing 2.17 Expressions in endpoint URIs can be resolved at runtime by evaluators.
<flow name="tickerFetcher"> <vm:inbound-endpoint path="ticker.fetcher" exchange-pattern="request-response" /> <http:outbound-endpoint exchange-pattern="request-response" host="www.google.com" port="80" path="finance/historical?q=#[message.payloadAs(java.lang.String)]" /> </flow>
你自己的代码中也能使用mule的表达式计算框架。
你需要做的唯一的事就是引用mule的上下文,它允许你使用表达式语言计算器:
ExpressionLanguage mel = muleContext.getExpressionLanguage();
String applicationName = mel.evaluate("app.name");
你可能发现计算器的求值方法是相当容易理解的。
更多请参考 Mule API SDK (www.mulesoft.org/docs/site/current3/apidocs/).
支持注解 表达式也可以使用注解。但要使用@Mule注解,像下面所示:
@Mule("#[app.name]")
String applicationName
本节不可能讲解所有的MEL的东西。但本身其余部分,你会看到大量的MEL的使用。
相关推荐
Mule in Action, Second Edition is a totally-revised guide covering Mule 3 fundamentals and best practices. It starts with a quick ESB overview and then dives into rich examples covering core concepts ...
《Mule in Action》一书深入探讨了Mule——一个轻量级消息框架与高度分布式的对象代理系统,为读者提供了全面的理论与实践指导。本书由David Dossot和John D'Emic共同撰写,旨在帮助开发者掌握Mule的核心功能与配置...
《Mule in Action》是一本专注于Mule ESB(企业服务总线)的入门教程,旨在帮助读者系统地学习和理解这一强大的集成平台。Mule ESB是开源领域中的一个重量级选手,常用于构建灵活、可扩展的企业级集成解决方案。这...
转换数据部分将讨论如何使用Mule表达式语言(MEL)和数据格式转换器(如XML、JSON、CSV等)来实现复杂的数据映射和转换。而路由数据部分则会详细讲解消息在不同目的地之间的传递机制,例如使用Mule的流控制来实现...
mule in action 和doc文档详细介绍 Mule的核心组件是UMO(Universal Message Objects,从Mule2.0开始UMO这一概念已经被组件Componse所代替),UMO实现整合逻辑。UMO可以是POJO,JavaBean等等。它支持30多种传输协议...
Mule in Action is acomprehensive tutorial designed for working Java developers. This authoritativebook explores the architecture and the main features of version Mule 2 throughnumerous running ...
### Mule in Action 第二版 英文正式版 关键知识点概述 #### 一、书籍简介与背景 《Mule in Action》第二版是一本详细介绍Mule ESB(Enterprise Service Bus)这一著名开源框架的书籍。该书由David Dossot、John D...
《Mule in Action》这本书是关于Mule ESB(企业服务总线)的权威指南,由David Chappell和James Strachan等作者撰写。Mule ESB是一种开源的集成平台,它允许开发者轻松地连接各种系统、服务和应用程序,实现数据的...
《Mule in Action》是关于Mule ESB的实战指南,该书深入浅出地介绍了如何使用Mule这一强大的企业服务总线(ESB)进行应用程序集成。Mule ESB以其用户基数庞大、文档详尽以及社区活跃而备受赞誉,是企业级集成解决...
Mule in Action是一本关于Mule ESB(企业服务总线)的实战指南,旨在为读者提供深入的实践知识和案例分析。ESB作为一种流行的中间件技术,用于实现不同系统之间的服务集成。Mule作为一个开源的ESB解决方案,通过其...
《Mule in Action》第二版是一本全面介绍如何使用Mule ESB进行高效集成开发的书籍,由David Dossot、John D’Emic和Victor Romero共同编写。 #### 二、Mule ESB的关键特性 **1. 消息处理:** Mule ESB支持多种消息...
Mule 表达式语言(MEL)是Mule ESB(企业服务总线)中的核心组件,用于处理数据和控制流程。它是基于Java的,但具有更简洁、直观的语法,特别适合于在Mule配置中进行数据操作。本摘要将深入探讨MEL的相关知识点,...
Spring Boot模块扩展... 将此依赖项添加到您的应用程序pom.xml <groupId>com.kloudtek.mule.module.springboot</groupId><artifactId>mule-springboot-module</artifactId><version>1.0.0</version>ule子弹簧引导模块