mule in action翻译12 : 2.4 使用Mule表达式语言

2024-03-25 05:38

本文主要是介绍mule in action翻译12 : 2.4 使用Mule表达式语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

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-endpointexchange-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翻译12 : 2.4 使用Mule表达式语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843986

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是