Java 在异常后更新camel exchange正文并继续路由

Java 在异常后更新camel exchange正文并继续路由,java,spring,apache-camel,Java,Spring,Apache Camel,希望你有时间回答我的问题。在过去的几天里,我一直在读有关骆驼的书,并设法把一切都设置好并运行起来。现在,我遇到了一个棘手的问题:)。基本上,我在运行时使用Java定义了一个路由,并将路由配置放在DB中。路由正在工作,消息正在从一侧流向另一侧。但是,当发生异常时,我希望知道异常发生的位置(在哪个路由端点之间),将当前exchange正文(对进一步处理有用的正在运行的消息)存储在DB中,由用户更新消息,然后从异常点重试路由执行(在异常点失败)。假设所有的路由步骤都是幂等的 我的解决方案: 为路线设置

希望你有时间回答我的问题。在过去的几天里,我一直在读有关骆驼的书,并设法把一切都设置好并运行起来。现在,我遇到了一个棘手的问题:)。基本上,我在运行时使用Java定义了一个路由,并将路由配置放在DB中。路由正在工作,消息正在从一侧流向另一侧。但是,当发生异常时,我希望知道异常发生的位置(在哪个路由端点之间),将当前exchange正文(对进一步处理有用的正在运行的消息)存储在DB中,由用户更新消息,然后从异常点重试路由执行(在异常点失败)。假设所有的路由步骤都是幂等的

我的解决方案:

  • 为路线设置拦截器
  • 尽可能多地将路线颗粒化(每个新步骤都是一条新路线)
  • 在每个步骤之间,使用当前和未来步骤以及当前交换主体更新数据库
  • 如果发生异常,将消息存储在DB中,并使用编辑器进行更新
  • 使用ProducerTemplate将消息发送到下一个路由点(取自DB)
  • 你觉得这个怎么样?这是可行的还是骆驼不能用这种方法支持我

    谢谢你的耐心和时间。
    希望我说得够清楚。

    您可以使用Camel的跟踪组件。camel的网站上已经提供了一个满足您需求的详细示例:

    您应该使用
    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站点上查阅详细信息,因为我刚刚在这里编写了这段代码。

    感谢您的帮助Hussain,我已经集成了Tracer,因为它是一种拦截策略。我的问题是关于使用ProducerTemplate向路由发送消息的整个方法和可能性。我想检查一下我的方法是否正确。谢谢西科尔斯基,你像侯赛因一样给了我宝贵的建议。希望这意味着我的方法是正确的和可能的。致以最良好的祝愿,米兰