【问题标题】:update camel exchange body after exception and continue the route异常后更新骆驼交换体并继续路线
【发布时间】:2014-09-23 14:56:38
【问题描述】:

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

我的解决方案:

  1. 为路线制作拦截器
  2. 将路线细分为尽可能多的部分(每一步都是新路线)
  3. 在每个步骤之间使用当前和未来步骤以及当前交换主体更新数据库
  4. 如果发生异常,将消息存储在数据库中,使用编辑器进行更新
  5. 使用 ProducerTemplate 向下一个路由点(取自 DB)发送消息

您对此有何看法?这是可行的还是骆驼不能用这种方法支持我?

感谢您的耐心和时间。 希望我已经足够清楚了。

【问题讨论】:

    标签: java spring apache-camel


    【解决方案1】:

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

    【讨论】:

    • 感谢 Hussain 的帮助,我已经集成了 Tracer,因为它是一个 InterceptStrategy。我的问题是关于使用 ProducerTemplate 向路由发送消息的整体方法和可能性。我想检查我的方法是否正确。
    【解决方案2】:

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

    【讨论】:

    • 谢谢西科尔斯基,你给了我像侯赛因一样的宝贵建议。希望这意味着我的方法是正确和可行的。最好的问候,米兰
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多