28.2. CSimple 和 Simple 之间的不同
简单语言是一种动态表达式语言,运行时解析为一组 Camel 表达式或 predicates。
csimple 语言被解析为常规的 Java 源代码,并与所有其他源代码编译,或者在通过 camel-csimple-joor
模块引导期间编译一次。
简单的语言通常非常轻便且快速,但对于一些通过 OGNL 路径进行动态方法调用的用例,那么简单语言将执行运行时内省和反映调用。这对性能有开销,也是创建 csimple 的原因之一。
csimple 语言需要是 typesafe,通过 OGNL 路径的方法调用需要在解析过程中知道类型。这意味着,对于 csimple 语言表达式,您需要在脚本中提供类类型,而在运行时简单内省它。
换句话说,简单语言使用 duck 输入 (如果看起来像一个 duck,则类似 duck,则它是一个 duck),而 csimple 则使用 Java 类型(输入安全)。如果有类型错误,那么 simple 会在运行时报告此报告,而 csimple 则有一个 Java 编译错误。
28.2.1. 其他 CSimple 功能 复制链接链接已复制到粘贴板!
csimple 语言包括一些额外的函数,它们支持使用 Collection
, Map
或数组类型的一般用例。以下函数 bodyAsIndex,headerAsIndex, 和 exchangePropertyAsIndex 用于这些用例,因为它们被键入。
功能 | 类型 | 描述 |
---|---|---|
bodyAsIndex(type, index) | 类型 |
用于从现有 |
mandatoryBodyAsIndex(type, index) | 类型 |
用于从现有 |
headerAsIndex (key,type,index) | 类型 |
要从现有的 |
mandatoryHeaderAsIndex (key,type,index) | 类型 |
要从现有的 |
exchangePropertyAsIndex(key, type, index) | 类型 |
要从现有的 |
mandatoryExchangePropertyAsIndex(key, type, index) | 类型 |
要从现有的 |
例如,给出了以下简单表达式:
Hello $\{body[0].name}
Hello $\{body[0].name}
此脚本没有类型信息,而简单的语言将在运行时解决这一操作,方法是内省消息正文,如果它是基于第一个元素的集合,则通过反映调用名为 getName
的方法。
在 csimple (编译)中,我们希望预编译它,因此最终用户必须提供带有 bodyAsIndex 功能的类型信息:
Hello $\{bodyAsIndex(com.foo.MyUser, 0).name}
Hello $\{bodyAsIndex(com.foo.MyUser, 0).name}