希望你的问题有一些空闲时间。在过去的几天里,我正在阅读有关Camel的内容,并设法将所有内容设置好并运行。现在,我碰到了一个棘手的部分:)。基本上,我在运行时使用Java定义路由并将路由配置放在DB中。路由正在工作,消息从一侧流向另一侧。但是,当发生异常时,我想知道发生异常的位置(在哪个路由端点之间),在DB中存储当前交换主体(对于进一步处理有用的空中消息),由用户更新消息然后从异常点(失败的地方)重试路由执行。让我们说所有路线步骤都是幂等的。
我的解决方案:
- 为路线制作拦截器
- 尽可能多地对路线进行制粒(每个新步骤都是新路线)
- 在每个步骤之间使用当前和未来步骤以及当前交换正文更新数据库
- 如果发生异常,请将消息存储在DB中,使用编辑器进行更新
- 使用ProducerTemplate
向下一个路线点(取自DB)发送消息 醇>
您如何看待这个?它是可行的还是Camel用这种方法不能支持我?
感谢您的耐心和时间。 希望我很清楚。
答案 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网站上查阅确切的详细信息,因为我刚刚在这里编写了此代码。