异常后更新驼峰交换体并继续路线

时间:2014-07-31 15:15:47

标签: java spring apache-camel

希望你的问题有一些空闲时间。在过去的几天里,我正在阅读有关Camel的内容,并设法将所有内容设置好并运行。现在,我碰到了一个棘手的部分:)。基本上,我在运行时使用Java定义路由并将路由配置放在DB中。路由正在工作,消息从一侧流向另一侧。但是,当发生异常时,我想知道发生异常的位置(在哪个路由端点之间),在DB中存储当前交换主体(对于进一步处理有用的空中消息),由用户更新消息然后从异常点(失败的地方)重试路由执行。让我们说所有路线步骤都是幂等的。

我的解决方案:

  
      
  1. 为路线制作拦截器
  2.   
  3. 尽可能多地对路线进行制粒(每个新步骤都是新路线)
  4.   
  5. 在每个步骤之间使用当前和未来步骤以及当前交换正文更新数据库
  6.   
  7. 如果发生异常,请将消息存储在DB中,使用编辑器进行更新
  8.   
  9. 使用ProducerTemplate
  10. 向下一个路线点(取自DB)发送消息   

您如何看待这个?它是可行的还是Camel用这种方法不能支持我?

感谢您的耐心和时间。 希望我很清楚。

2 个答案:

答案 0 :(得分:1)

您可以使用Camel的跟踪器组件。满足您需求的详细示例已在camel网站上提供:http://camel.apache.org/tracer-example.html

答案 1 :(得分:0)

您应该使用onException()子句来解决这个问题。例如:

public void configure() throws Exception{
  //This is a global onException definition and will work for all routes defined in this calss
    onException().process(new Processor(){
        public void process(Exchang arg0){
            Exception e = arg0.getProperty(Exchange.EXCEPTION_CAUGHT,Exception.class);
            //get message and other properties that you  are interested in 
            db.saveOrUpdate(/*Pass your custom object here*/); 
        }

    }).handled(true);

   from("direct:route1")
   //some processing
   .to("jms:route1");

   from("direct:route2")
   //some processing
   .to("http://route2");

}

您可能需要在apache camel网站上查阅确切的详细信息,因为我刚刚在这里编写了此代码。