第 70 章 CSimple
CSimple 语言 编译 了 简单 语言。
70.1. CSimple 和 Simple 不同
简单的语言是动态表达式语言,即运行时被解析为一组 Camel 表达式或 Predicates。
csimple 语言被解析为常规的 Java 源代码,并与所有其他源代码一起编译,或者通过 camel-csimple-joor
模块在 bootstrap 期间编译一次。
简单语言通常非常轻量级且快速,但对于一些通过 OGNL 路径调用的用例,简单语言会进行运行时内省和反映调用。这会降低性能,并且是创建 csimple 的原因之一。
csimple 语言要求通过 OGNL 路径进行 typesafe 和方法调用,才能在解析过程中了解类型。这意味着,您需要在脚本中提供类类型,而在运行时简单内省它,您需要提供脚本中的类类型。
换而言之,简单语言使用 duck 键入 (如果它看起来像 duck 和 quacks 相似),那么它是一个 duck,而 csimple 使用的是 Java 类型(类型安全)。如果出现类型错误,那么 simple 将在运行时报告此问题,而 csimple 则会出现 Java 编译错误。
70.1.1. 其他 CSimple 功能
csimple 语言包括一些额外的功能,以支持使用 集合
、映射或阵列类型的通用用例。以下功能 bodyAsIndex、header AsIndex 和 ExchangePropertyAsIndex 用于这些用例。
功能 | 类型 | Description |
---|---|---|
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}