架构

内容增强

师成师成· 更新于 2026-09-28· 阅读 12 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

内容增强器

Camel 支持 EIP 模式中的内容增强器。

image

在 Camel 中,内容增强可以通过多种方式实现:

最符合 Camel 风格的方式是使用 Enrich EIP。

使用消息转换器进行内容增强

你可以从某个目的地消费消息,使用类似 Velocity 或 XQuery 的方式对其进行转换,然后将其发送到另一个目的地。

  • Java
  • XML
  • YAML
from("activemq:My.Queue")
    .to("velocity:com/acme/MyResponse.vm")
    .to("activemq:Another.Queue");
<route>
  <from uri="activemq:My.Queue"/>
  <to uri="velocity:com/acme/MyResponse.vm"/>
  <to uri="activemq:Another.Queue"/>
</route>
- route:
    from:
      uri: activemq:My.Queue
      steps:
        - to:
            uri: velocity:com/acme/MyResponse.vm
        - to:
            uri: activemq:Another.Queue

你也可以在 Java DSL 中直接(使用流畅构建器)将消息作为表达式(Expression)来丰富。在下面的示例中,通过在消息体后追加 ` World!` 来丰富消息:

仅 Java:用于向消息体追加内容的流畅构建器

from("direct:start")
    .setBody(body().append(" World!"))
    .to("mock:result");

流畅构建器在 XML 或 YAML DSL 中不可用,此时你可以使用 Simple 语言:

  • Java
  • XML
  • YAML
from("direct:start")
    .setBody(simple("${body} World!"))
    .to("mock:result");
<route>
  <from uri="direct:start"/>
  <setBody>
    <simple>${body} World!</simple>
  </setBody>
  <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct
      parameters:
        name: start
      steps:
        - setBody:
            expression:
              simple:
                expression: "${body} World!"
        - to:
            uri: mock
            parameters:
              name: result

使用 Processor 进行内容增强

在本例中,我们通过显式 Java 代码添加自己的 Processor,以增强消息内容:

纯 Java 实现:使用内联 Processor 来增强消息

from("direct:start")
    .process(new Processor() {
        public void process(Exchange exchange) {
            Message msg = exchange.getMessage();
            msg.setBody(msg.getBody(String.class) + " World!");
        }
    })
    .to("mock:result");

在上面的 Java 代码中,我们使用了内联的 Processor,这在 XML 或 YAML DSL 中较难实现。良好的做法是为自定义 Processor 编写一个类,然后在 DSL 中引用它:

纯 Java:在 Registry 中注册的自定义 Processor 类

@BindToRegistry("myProcessor")
public class MyProcessor implements Processor {

    @Override
    public void process(Exchange exchange) {
        Message msg = exchange.getMessage();
        msg.setBody(msg.getBody(String.class) + " World!");
    }
}

然后你可以通过该处理器的 id 来引用它。

  • Java
  • XML
  • YAML
from("direct:start")
    .process("myProcessor")
    .to("mock:result");
<route>
    <from uri="direct:start"/>
    <process ref="myProcessor"/>
    <to uri="mock:result"/>
</route>
- route:
    from:
      uri: direct
      parameters:
        name: start
      steps:
        - process:
            ref: myProcessor
        - to:
            uri: mock
            parameters:
              name: result

使用 Bean EIP 进行内容丰富

我们可以使用 Bean EIP,调用任意 bean 上的任意 Java 方法来充当内容丰富器:

  • Java
  • XML
  • YAML
from("activemq:My.Queue")
    .bean("myBeanName", "doTransform")
    .to("activemq:Another.Queue");
<route>
    <from uri="activemq:Input"/>
    <bean ref="myBeanName" method="doTransform"/>
    <to uri="activemq:Output"/>
</route>
- route:
    from:
      uri: activemq:Input
      steps:
        - bean:
            ref: myBeanName
            method: doTransform
        - to:
            uri: activemq:Output

使用 Enrich EIP 进行内容充实

Camel 提供了两种内容充实(Content Enricher)EIP:

  • Enrich EIP:这是最常见的内容充实方式,使用 Producer 来获取数据。它通常用于请求-回复(Request Reply)消息传递,例如调用外部 Web 服务。
  • Poll Enrich EIP:使用轮询消费者(Polling Consumer)来获取补充数据。它通常用于事件消息(Event Message)消息传递,例如读取文件或通过 FTP 下载文件。

更多详情请参阅 Enrich EIP 和 Poll Enrich EIP。

评论

登录后参与评论

正在加载评论…