87.5. 例子
在以下 XML DSL 示例中,我们根据标头值过滤:
Simple 语言可用于 Message Filter 模式上面的 predicate 测试,其中测试消息是否有 foo 标头(存在带有键 foo 的标头)。如果表达式评估为 true,则消息将路由到 mock:fooOrders 端点,否则将丢弃消息。
Java DSL 中的同一示例:
from("seda:orders")
.filter().simple("${header.foo}")
.to("seda:fooOrders");
from("seda:orders")
.filter().simple("${header.foo}")
.to("seda:fooOrders");
您还可以将简单的语言用于简单的文本串联,例如:
from("direct:hello")
.transform().simple("Hello ${header.user} how are you?")
.to("mock:reply");
from("direct:hello")
.transform().simple("Hello ${header.user} how are you?")
.to("mock:reply");
请注意,我们现在必须在表达式中使用 $\\{ } 占位符来允许 Camel 正确解析它。
此示例使用 date 命令输出当前日期。
from("direct:hello")
.transform().simple("The today is ${date:now:yyyyMMdd} and it is a great day.")
.to("mock:reply");
from("direct:hello")
.transform().simple("The today is ${date:now:yyyyMMdd} and it is a great day.")
.to("mock:reply");
在以下示例中,我们调用 bean 语言在 bean 上调用方法,以包含在返回的字符串中:
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator}")
.to("mock:reply");
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator}")
.to("mock:reply");
其中 orderIdGenerator 是 Registry 中注册的 bean 的 id。如果使用 Spring,则它是 Spring bean id。
如果要声明在 id generator bean 上调用哪个方法,我们必须加上 .method 名称,例如在调用 generateId 方法的地方。
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
.to("mock:reply");
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
.to("mock:reply");
我们可以使用 ?method=methodname 选项熟悉 Bean 组件本身:
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
.to("mock:reply");
from("direct:order")
.transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
.to("mock:reply");
您还可以将正文转换为给定类型,例如确保它是一个字符串,您可以:
<transform>
<simple>Hello ${bodyAs(String)} how are you?</simple>
</transform>
<transform>
<simple>Hello ${bodyAs(String)} how are you?</simple>
</transform>
有几种类型具有简短表示法,因此我们可以使用 String 而不是 java.lang.String。这些是: byte[]、String、Integer、Long。所有其他类型都必须使用其 FQN 名称,如 org.w3c.dom.Document。
也可以从标头 映射 中查找值:
<transform>
<simple>The gold value is ${header.type[gold]}</simple>
</transform>
<transform>
<simple>The gold value is ${header.type[gold]}</simple>
</transform>
在上面的代码中,我们查找名称 type 的标头,并将其视为 java.util.Map,然后使用键 金级 查找并返回值。如果标头无法转换为 Map,则会抛出异常。如果名称 类型为 的标头不存在 null。
您可以嵌套功能,如下所示:
<setHeader name="myHeader">
<simple>${properties:${header.someKey}}</simple>
</setHeader>
<setHeader name="myHeader">
<simple>${properties:${header.someKey}}</simple>
</setHeader>