apache camel 相关配置_Apache Camel快速入门(下)-架构

编辑推荐:

本文来自于csdn,文章紧接着上两个内容,本文主要讲解了CamelContext,代码示例讲解比较详细。

3-5-2-3循环动态路由 Dynamic Router

动态循环路由的特点是开发人员可以通过条件表达式等方式,动态决定下一个路由位置。在下一路由位置处理完成后Exchange将被重新返回到路由判断点,并由动态循环路由再次做出新路径的判断。如此循环执行直到动态循环路由不能再找到任何一条新的路由路径为止。下图来源于官网,展示了动态循环路由的工作效果:

这里可以看出动态循环路由(dynamicRouter)和之前介绍的动态路由(recipientList)在工作方式上的差异。dynamicRouter一次选择只能确定一条路由路径,而recipientList只进行一次判断并确定多条路由分支路径;dynamicRouter确定的下一路由在执行完成后,Exchange对象还会被返回到dynamicRouter中以便开始第二次循环判断,而recipientList会为各个分支路由复制一个独立的Exchange对象,并且各个分支路由执行完成后Exchange对象也不会返回到recipientList;下面我们还是通过源代码片段,向各位读者展示dynamicRouter的使用方式。在代码中,我们编排了三个路由DirectRouteA主要负责通过Http协议接收处理请求,并执行dynamicRouter。DirectRouteB和DirectRouteC两个路由是可能被dynamicRouter选择的分支路径:

DirectRouteA

/**

* 第一个路由,主要用于定义整个路由的起点

* 通过Http协议接收处理请求

* @author yinwenjie

*/

public class DirectRouteA extends RouteBuilder

{

/* (non-Javadoc)

* @see org.apache.camel.builder.RouteBuilder#configure()

*/

@Override

public void configure() throws Exception {

from("jetty:http://0.0.0.0:8282/dynamicRouterCamel")

// 使用dynamicRouter,进行“动态路由”循环,

// 直到指定的下一个元素为null为止

.dynamicRouter().method(this, "doDirect")

.process(new OtherProcessor());

}

/**

* 该方法用于根据“动态循环”的次数,确定下一个执行的Endpoint

* @param properties 通过注解能够获得的Exchange中properties属性,可以进行操作,并反映在整个路由过程中

* @return

*/

public String doDirect(@Properties Map

Object> properties) {

// 在Exchange的properties属性中,取出Dynamic Router的循环次数

AtomicInteger time = (AtomicInteger)properties.get("time");

if(time == null) {

time = new AtomicInteger(0);

properties.put("time", time);

} else {

time = (AtomicInteger)time;

}

LOGGER.info("这是Dynamic Router循环第:【"

+ time.incrementAndGet() + "】次执行!执行线程:"

+ Thread.currentThread().getName());

// 第一次选择DirectRouteB

if(time.get() == 1) {

return "direct:directRouteB";

}

// 第二次选择DirectRouteC

else if(time.get() == 2) {

return "direct:directRouteC";

}

// 第三次选择一个Log4j-Endpoint执行

else if(time.get() == 3) {

return "log:DirectRouteA?showExchangeId=true&showProperties=ture&showBody=false";

}

// 其它情况返回null,终止 dynamicRouter的执行

return null;

}

}

在DirectRouteA中我们使用“通过一个method方法返回信息”的方式确定dynamicRouter“动态循环路由”的下一个Endpoint。当然在实际使用中,开发人员还可以有很多方式向dynamicRouter“动态循环路由”返回指定的下一Endpoint。例如使用JsonPath指定JSON格式数据中的某个属性值,或者使用XPath指定XML数据中的某个属性值,又或者使用header方法指定Exchange中Header部分的某个属性。但是无论如何请开发人员确定一件事情:向dynamicRouter指定下一个Endpoint的方式中是会返回null进行循环终止的,否则整个dynamicRouter会无限的执行下去。

以上doDirect方法中,我们将一个计数器存储在了Exchange对象的properties区域,以便在同一个Exchange对象执行doDirect方法时进行计数操作。当同一个Exchange对象第一次执行动态循环路由判断时,选择directRouteB最为一下路由路径;当Exchange对象第二次执行动态循环路由判断时,选择DirectRouteC作为下一路由路径;当Exchange对象第三次执行时,选择一个Log4j-Endpoint作为下一个路由路径;当Exchange对象第四次执行时,作

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值