Camel Bean参数绑定

总体说明:

camel中一个方法的返回值会放入到exchange中的input message中传递给下一个方法

Bean参数绑定 

单参数绑定

方法的第一个参数默认是用camle的Exchange的input message 转换而来。类型转换有camel来实现。

多个参数绑定

上图,展示了多参数绑定时的原则。当方法有多个参数时,参数的绑定变得有点复杂。有许都类型,标题为Bean parameter bindings的大方框包含下面四个小方框: 

  1. Camel built-in types(Camel内建类型)---Camel提供了一系列特殊绑定的概念。
  2. Exchange---这是Camel的Exchange,它允许绑定到输入消息,比如它的body(消息体)和headers(消息头部)。
  3. Camel annotations---在处理多个参数时,可以使用注解来区分它们
  4. 、Camel language annotations--- 这是一个不常用的功能,允许你将参数绑定到Camel语言注解

 

用多个参数比使用单一参数更复杂。遵循下面这些法则通常是一个好主意: 

  1. 使用第一个参数作为消息体,可以使用@Body注解;
  2. 对其他参数使用一个内置类型或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中。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值