一、Camel消息处理器Processor
如果需要对传输的数据进行处理,则可以通过Processor接口实现消息处理器:
java
public class MyProcessor implements Processor {
// Processes the message exchange
// @param exchange the message exchange
// @throws Exception if an internal processing error has occurred.
public void process(Exchange exchange) throws Exception {
// do something...
}
}
然后,可以在路由配置中调用此处理器:
java
from("activemq:myQueue").process(new MyProcessor());
也可在注册表中注册此处理器,再通过Bean ID调用处理器。
如果处理逻辑较为简单,可以使用匿名类:
java
from("activemq:myQueue").process(new Processor() {
public void process(Exchange exchange) throws Exception {
String payload = exchange.getMessage().getBody(String.class);
// do something with the payload and/or exchange here
exchange.getMessage().setBody("Changed body");
}
}).to("activemq:myOtherQueue");
二、消息交换接口Exchange
在 Camel 中,请求消息及其对应的回复或异常消息通过Exchange接口来表示。
Exchange内部包含Message,可通过Exchange.getIn()获取。Message是消息接口,包含信息如下:- body:消息体(即有效载荷 payload)
- headers:携带附加信息的消息头
- messageId:消息的唯一标识。默认情况下,消息使用与
Exchange.getExchangeId()相同的 ID。 - timestamp:消息的时间戳,即消息产生的时间。一些系统(如 JMS、Kafka、AWS)在事件或消息中自带时间戳。当 Camel 接收到这些消息时,如果存在时间戳,则该方法会返回该时间戳。
Exchange的生命周期贯穿整个路由,因此可以在Exchange保存重要数据数据(properties):
java
Exchange.getProperty(String)
Exchange.setProperty(String, Object)
- 如果
Exchange在路由过程中失败,引发的异常可通过Exchange.getException()获取。 - 其他常用api可参考Exchange接口详细方法说明
Camel还提供了简单表达式语言(SEL),用于处理简单的信息处理,这种语言支持使用${body}等占位符来表示动态表达式和函数,等价于Exchange.getIn():
java
from("kafka:test,test1,test2?brokers=localhost:9092")
.process(new MyProcessor())
.log("Message received from Kafka : ${body}")
.log(" on the topic ${headers[kafka.TOPIC]}")