303.7. Samples

在 Spring XML 示例中,我们基于一个标头值进行过滤:

<from uri="seda:orders">
   <filter>
       <simple>${in.header.foo}</simple>
       <to uri="mock:fooOrders"/>
   </filter>
</from>

可以在 Message Filter 模式下将简单语言用于上述 predicate 测试,其中我们测试消息中是否有 foo 标头(包含 foo 键的标题)。如果表达式评估为 true,则消息将路由到 模拟:fooOrders 端点,否则会丢弃消息。

Java DSL 中的相同示例:

from("seda:orders")
    .filter().simple("${in.header.foo}")
        .to("seda:fooOrders");

您还可以使用简单语言进行简单文本组合,例如:

from("direct:hello")
    .transform().simple("Hello ${in.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");

在下面的示例中,我们调用 bean 语言以调用要包含在返回的字符串中的 Bean 方法:

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator}")
    .to("mock:reply");

其中 orderIdGenerator 是 registry 中注册的 bean 的 id。如果使用 Spring,则它是 Spring bean id。

如果我们希望声明在订购 id 生成器中调用的方法,则必须添加 .method 名称,如我们调用 generateId 方法的下方。

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
    .to("mock:reply");

我们可以使用我们熟悉 Bean 组件本身的 ?method=methodname 选项:

from("direct:order")
    .transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
    .to("mock:reply");

通过从 Camel 2.3 开始,您可以将正文转换为给定类型,例如确保它是一个 String:

<transform>
  <simple>Hello ${bodyAs(String)} how are you?</simple>
</transform>

有几个类型有简写表示法,因此我们可以使用 String 而不是 java.lang.String。它们是: byte[]、String、Integer、Long。所有其他类型都必须使用其 FQN 名称,如 org.w3c.dom.Document

也可以从 Camel 2.3 中的标头 映射 中查找值:

<transform>
  <simple>The gold value is ${header.type[gold]}</simple>
</transform>

在上面的代码中,我们使用名称 类型 查找标头,并将其视为 java.util.Map,然后使用键 gold 键进行查找并返回值。如果标头无法转换为映射异常。如果名称 类型为 的标头不存在 null

在 Camel 2.9 开始,您可以嵌套功能,如下所示:

<setHeader headerName="myHeader">
  <simple>${properties:${header.someKey}}</simple>
</setHeader>