第 70 章 CSimple
CSimple 语言 被编译 简单 语言。
70.1. CSimple 和 Simple 之间的区别
简单的语言是动态表达式语言,运行时被解析为一组 Camel 表达式或 predicates。
csimple 语言被解析为常规 Java 源代码,并与所有其他源代码一起编译,或通过 camel-csimple-joor
模块在 bootstrap 期间编译一次。
简单的语言通常是非常轻便且快速的,但对于某些用例,通过 OGNL 路径进行动态方法调用,然后简单的语言进行运行时内省和反映调用。这在性能方面有开销,这是创建 csimple 的原因之一。
csimple 语言需要类型safe,并且通过 OGNL 路径的方法调用需要在解析期间知道类型。这意味着,您需要在脚本中提供类类型的 csimple 语言表达式,而简单的内省则在运行时进行内省。
换句话说,简单语言使用 duck 类型(如果它看起来像一个 duck,并且像 duck ),则 csimple 使用 Java 类型(typesafety)。如果存在类型错误,则 simple 将在运行时报告,并且 csimple 会出现 Java 编译错误。
70.1.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}
此脚本没有类型信息,简单语言将在运行时解决这个问题,方法是内省消息正文,如果基于集合查找第一个元素,则通过反映调用名为 getName
的方法。
在 csimple (编译)中,我们希望预编译这一点,因此最终用户必须使用 bodyAsIndex 函数提供类型信息:
Hello $\{bodyAsIndex(com.foo.MyUser, 0).name}