参数绑定注解
参数绑定注解
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 求值的 $ 占位符。
评论
登录后参与评论
KnowForge