总体说明:
camel中一个方法的返回值会放入到exchange中的input message中传递给下一个方法
Bean参数绑定
单参数绑定
方法的第一个参数默认是用camle的Exchange的input message 转换而来。类型转换有camel来实现。
多个参数绑定
上图,展示了多参数绑定时的原则。当方法有多个参数时,参数的绑定变得有点复杂。有许都类型,标题为Bean parameter bindings的大方框包含下面四个小方框:
- Camel built-in types(Camel内建类型)---Camel提供了一系列特殊绑定的概念。
- Exchange---这是Camel的Exchange,它允许绑定到输入消息,比如它的body(消息体)和headers(消息头部)。
- Camel annotations---在处理多个参数时,可以使用注解来区分它们
- 、Camel language annotations--- 这是一个不常用的功能,允许你将参数绑定到Camel语言注解
用多个参数比使用单一参数更复杂。遵循下面这些法则通常是一个好主意:
- 使用第一个参数作为消息体,可以使用@Body注解;
- 对其他参数使用一个内置类型或Camel注解。
camel的内置参数列表:
类型 | 说明 |
Exchange | Camel的exchange,包含将要绑定到方法参数的值。 |
Message | Camel的输入消息。包含绑定到方法第一个参数的消息体。 |
CamelContext | CamelContext,Camel 的运营时上线文,可以用他来访问Camel的所有组件的情况下。 |
TypeConverter | Camel的类型转换机制。 当您需要进行类型转换时可以使用。在3.6节已经学习过类型转换机制。 |
Registry | bean注册表。这允许您在注册表中查找bean。 |
Exception | 异常类型。只有在exchange中有错误或异常的时候,Camel参会绑定这个类型。利用此类型可以再bean中进行错误处理。 |
例子:
public string echo(String echo, CamelContext context)
在这个例子中,第一个参数为camle的Exchange的input message ,第二个参数你绑定了CamelContext,通过CamelContext使你可以访问Camel的所有组件。
如果您需要在注册表总查找一些bean(可以直接使用宿主中的bean),你可以绑定注册表类型:
public string echo(String echo, Registry registry) {
OtherBean other = registry.lookup("other", OtherBean.class);
...
}
使用Camel注解进行绑定
Camel提供了一系列的注解,用于exchange和bean参数之间的绑定。如果你想对参数绑定有更多的控制,你应该使用这些注解。例如,如果没有这些注解,Camel总是会将消息体绑定到方法的第一个参数上,但是如果使用@body注解,你可以将消息体绑定到方法的任一参数上。
假设你有如下bean方法:
public String orderStatus(Integer customerId, Integer orderId)
而且你有一个Camel消息,消息包含如下数据:
1、body(消息体),包含订单id,类型为String
2、header(消息头部),包含客户id,类型为Integer
利用Camel注解,你可以像下面这样将Exchange绑定到方法签名上面:
public String orderStatus(@Header("customerId") Integer customerId,@Body Integer orderId)
注意:你使用了@Header注解将消息头部绑定到了第一个参数上,使用@Body注解将消息体绑定到了第二个参数上。
下表列出了所有的Camel参数绑定注解。
注解 | 说明 |
@Attachments | 将参数绑定到消息附件上。此时的参数类型必须是java.util.Map类型。 |
@Body | 将参数绑定到消息体上 |
@Header(name) | 将参数绑定到给定的消息头上。 |
@Headers | 将参数绑定到所有的输入头部上。此时的参数类型必须是java.util.Map类型。 |
@OutHeaders | 将参数绑定到所有的输出头部上。此时的参数类型必须是java.util.Map类型。利用这个注解,你可以向输出消息中添加头部。 |
@Property(name) | 将参数绑定到给定的exchange属性上 |
@Properties | 将参数绑定到所有的exchange属性上。此时的参数类型必须是java.util.Map类型。 |
例子:
让我们再看几个例子。例如,你可以使用@Headers注解将输入头部绑定到Map类型上:
public String orderStatus(@Body Integer orderId, @Headers Map headers) {
Integer customerId = (Integer) headers.get("customerId");
String customerType = (String) headers.get("customerType");
...
}
当消息有多个头部时,可以使用此注解,这样你就不需要为每个头部都添加一个对应的参数了。
当你使用的是请求/响应形式的消息(也确定为InOut消息交换模式)时,可以使用@OutHeaders注解。@OutHeaders可以直接操作输出消息的头部,意味着你可以在bean中直接操纵这些消息头部。下面是一个例子:
public String orderStatus(@Body Integer orderId, @OutHeaders Map headers) {
...
headers.put("status", "APPROVED");
headers.put("confirmId", "444556");
return "OK";
}
你使用@OutHeaders注解了第二个参数。与@Headers不同, 当方法调用时,@OutHeaders是空的。这里的理念是:你负责把需要保存到输出消息中的头部设置到这个map中。
Header/Property 区别
生命周期来开 property的作用于为整个camel的路由中,Header的作用域只在message中。