架构

参数绑定注解

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

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

参数绑定注解

Camel 提供的 Bean 参数绑定注解如下:

注解含义
org.apache.camel.Body绑定到入站消息体
org.apache.camel.Header按给定名称绑定到消息头
org.apache.camel.Headers绑定到消息头的 Map
org.apache.camel.Variable按给定名称绑定到命名变量
org.apache.camel.Variables绑定到变量 map
org.apache.camel.ExchangeProperty按给定名称绑定到 Exchange 上的命名属性
org.apache.camel.ExchangeProperties绑定到 Exchange 上的 Exchange 属性 map
org.apache.camel.ExchangeException绑定到 Exchange 上设置的异常

这些注解可与 Bean 组件配合使用,也可在 DSL 中调用 Bean 时使用。

在调用 Bean 方法时,可以使用注解来定义表达式,或从消息中提取各种消息头、属性或负载。有关调用 Bean 的更多详细信息,请参阅 Bean 集成。

如果未使用任何注解,Camel 会假定单个参数即为消息体。随后,Camel 将使用类型转换器机制,将表达式的值转换为参数的实际类型。

使用 Bean 参数绑定注解

在下面的示例中,我们有一个 @Consume 消费者(类似消息驱动方式),它从 activemq 队列中消费 JMS 消息。我们使用 @Header 和 @Body 参数绑定注解,将 JMSMessage 绑定到方法参数。

public class MyBean {

    @Consume("activemq:my.queue")
    public void doSomething(@Header("JMSCorrelationID") String correlationID, @Body String body) {
        // process the inbound message here
    }

}

在上面的示例中,Camel 会提取 Message.getJMSCorrelationID() 的值,然后在必要时使用 Type Converter 将该值转换为参数所需的类型,从而为 correlationID 参数注入值。接着,消息的 payload 会被转换为 String 并注入到 body 参数中。

如果你不想使用 @Consume 注解,也完全可以不使用它,因为你同样可以利用 Camel DSL 来路由到该 bean 的方法。

从 Camel 路由中调用 bean

下面是另一个示例,它不使用 POJO Consuming 注解,而是使用 DSL 将消息路由到 bean 的方法。

public class MyBean {

    public void doSomething(@Header("JMSCorrelationID") String correlationID, @Body String body) {
        // process the inbound message here
    }

}

路由 DSL 的写法如下:

  • Java
  • XML
  • YAML
from("activemq:someQueue").
  to("bean:myBean");
<route>
    <from uri="activemq:someQueue"/>
    <to uri="bean:myBean"/>
</route>
- route:
    from:
      uri: activemq:someQueue
      steps:
        - to:
            uri: bean:myBean

在这里,myBean 会先在 Registry 中被查找,然后会使用消息体来尝试确定应当调用哪个方法。

如果你想明确指定,可以使用:

  • Java
  • XML
  • YAML
from("activemq:someQueue").
  to("bean:myBean?method=doSomething");
<route>
    <from uri="activemq:someQueue"/>
    <to uri="bean:myBean?method=doSomething"/>
</route>
- route:
    from:
      uri: activemq:someQueue
      steps:
        - to:
            uri: bean:myBean
            parameters:
              method: doSomething

这里还有一个巧妙的例子,用来展示 Camel 的强大之处。你可以把注解和普通参数混合使用,因此在上面的例子中,我们同样可以让 Exchange 参与进来:

public class MyBean {

    public void doSomething(@Header("user") String user, @Body String body, Exchange exchange) {
        exchange.getIn().setBody(body + "MyBean");
    }

}

基于注解的表达式语言

在使用 Bean 集成时,你也可以使用 Camel 支持的任意语言将表达式绑定到方法参数。例如,你可以使用以下任意注解:

注解说明
@Bean注入一个 Bean 表达式
@Constant注入一个 Constant 表达式
@Groovy注入一个 Groovy 表达式
@Header注入一个 Header 表达式
@Simple注入一个 Simple 表达式
@XPath注入一个 XPath 表达式

上表仅列出了一些常用语言。你可以在语言列表中找到所有受支持的语言,每种语言都有自己的注解可供使用。

要使用 @JSonPath 注解,必须引入相应语言的 JAR 包,例如 camel-groovy 或 camel-jsonpath。

下面是使用 @XPath 的示例:

public class Foo {

    @Consume("activemq:my.queue")
    public void doSomething(@XPath("/foo/bar/text()") String correlationID, @Body String body) {
        // process the inbound message here
    }

}

使用 @Bean 的高级示例

下面是一个使用 @Bean 绑定注解的示例,你可以调用一个 POJO 来提供参数值:

public class MyBean {

    @Consume("activemq:my.queue")
    public void doSomething(@Bean("myCorrelationIdGenerator") String correlationID, @Body String body) {
        // process the inbound message here
    }
}

当消息从 ActiveMQ 队列中被消费时,Camel 会调用 doSomething 方法。带有 @Bean 注解的参数告诉 Camel 去调用另一个 bean,由它来计算 correlation id(关联 ID)参数:

public class MyIdGenerator {

    private UserManager userManager;

    public String generate(@Header(name = "user") String user, @Body String payload) throws Exception {
       User user = userManager.lookupUser(user);
       String userId = user.getPrimaryId();
       return userId + generateHashCodeForPayload(payload);
   }
}

POJO MyIdGenerator 有一个接受两个参数的公共方法。我们还为它加上了 @Header 和 @Body 注解,以帮助 Camel 知道应该从正在处理的 Exchange 中绑定什么到这些参数上。

当然,如果你只是需要一个简单的 ID 生成器,这样写可以简化很多。但我们希望借此演示,你可以在任何地方使用 Bean 绑定注解。

public class MySimpleIdGenerator {

    public static int generate()  {
       // generate a unique id
       return 123;
   }
}

最后,我们只需记得将 Bean 注册到 Registry 中:

例如在 Spring XML 中:

<bean id="myCorrelationIdGenerator" class="com.mycompany.MySimpleIdGenerator"/>

示例:使用 Groovy

在此示例中,我们有一个 Exchange,其 in 头中存储了一个 User 对象。该 User 对象包含一些用于获取用户信息的方法。我们希望使用 Groovy 注入一个表达式,用于提取用户的名字并将它们拼接起来,赋给 fullName 参数。

public class MyBean {

    public void doSomething(@Groovy("$request.header['user'].firstName $request.header['user'].familyName") String fullName, @Body String body) {
        // process the inbound message here
    }

}

Groovy 支持 GString,它类似于一种模板,可以在其中插入由 Groovy 求值的 $ 占位符。

评论

登录后参与评论

正在加载评论…