Camel中支持的路由规则非常丰富,包括:Message Filter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencer等等。在Camel的官方文档中使用了非常形象化的图形来表示这些路由功能(http://camel.apache.org/enterprise-integration-patterns.html):
1、第一个路由选择器 通过header定义属性进行判断
public void configure() throws Exception {
from("timer://user?period=1000").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
in.setHeader("name","1");
in.setHeader("age","1");
}
}).choice()
.when(new Predicate() {
@Override
public boolean matches(Exchange exchange) {
return exchange.getIn().getHeader("name").equals("1");
}
}).process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("name");
}
})
.when(new Predicate() {
@Override
public boolean matches(Exchange exchange) {
return exchange.getIn().getHeader("age").equals("1");
}
}).process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("age");
}
})
.otherwise().process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("others");
}
}).endChoice();
}
当某一个条件成立后,不进行后续判断直接结束
2、一些ExpressionClause
2.1 exchange
可以将
.when(new Predicate() {
@Override
public boolean matches(Exchange exchange) {
return exchange.getIn().getHeader("age").equals("1");
}
})
改成
.when().exchange(exchange -> exchange.getIn().getHeader("age").equals("1"))
可以实现同样的效果
2.2transfrom 和 setbody
.transform().exchange(this::transformTo)
public MessageBean transFormTo(Exchange exchange) {
MessageBean messageBean = new MessageBean();
messageBean.setAge(1);
messageBean.setId(1);
messageBean.setName("testName");
return messageBean;
}
transform() 返回值 ExpressionClause exchange(function) 对exchange信息进行处理
(也可以将transform 改成 setbody())
将之后 函数的返回值设置为body(可以exchange()或者body( ) 等)
例如:exchange()中的方法(transformTo)的返回值设置为 exchange信息的请求体中
同样可以
.transform(new Expression() {
@Override
public T evaluate(Exchange exchange, Class type) {
System.out.println(exchange);
return (T)"SS";
}
})
T是object类
evaluate()中的方法的返回值设置为 exchange信息的请求体中 "SS"
2.3body
1、参数 class
.when().body(TestBean.class)
当请求体中对象正确时候进行下一步
2 参数 Function
when().body(this::transFormTo)
transFormTo 方法传入的对象为 body值 ,根据返回值
3、参数 BiFunction
when().body((o, stringObjectMap) -> "1".equals(o));
o body的object对象 stringObjectMap Map的 header 对象
4、两个参数 class ,Function
.when().body(MessageBean.class ,messageBean -> messageBean.getAge());
类似2 方法 指定了传入body参数的类型
5、两个参数 class ,BiFunction
.when().body(MessageBean.class ,(messageBean,stringObjectMap) -> messageBean.getAge());
类似3 方法 指定了传入body参数的类型
3、分析两种的区别
chioce 返回 ChoiceDefinition 类
调用when(processor )返回ChoiceDefinition
调用from语句时返回为 RouteDefinition
两个类都继承 processorDefinition 这个类中定义了大量endPoint的方法(详情看源码)
而当调用when()无参方法时候 返回 ExpressionClause
这个类的中文介绍是:
表示DSL中的表达式子句,当表达式完成时,子句将继续到DSL的另一部分。
也就是说当调用when()通过这个类中的方法进行选择判断
很多方法的返回值都是泛型 T 对上例来说就是 ChoiceDefinition 就可以继续进行之后判断操作
具体请看源码