我正在使用 Apache 骆驼路由来处理我的消息。在我的用户界面中,我需要显示这些消息,并且在详细页面中我需要显示路由中的消息流所以我计划使用拦截,以便在输入每个模式之前将消息将被截获一个处理器将其存储在DB中。但是我在找出最后处理消息的模式时遇到了问题。就像拦截是否发生在聚合、拆分或处理之后。在哪种模式下我的拦截处理器工作。如果有任何其他方法可以完全满足我在数据库中存储路由详细信息的需要,有什么方法可以找出这个或它可以吗?请帮助 这种图表是我需要从路线中创建的。提前致谢。
1 回答
我在找出最后处理消息的模式时遇到了问题。就像拦截是否发生在聚合、拆分或处理之后。在哪种模式下我的拦截处理器工作。有什么办法可以找出这个吗?
CamelMessageHistory
您可以从作为对象列表的交换属性中获取一些详细信息DefaultMessageHistory
。这些包含 routeId 和有关端点节点的一些详细信息,例如其 id。如果您使用interceptFrom
骆驼将截获的端点 uri 存储到CamelInterceptedEndpoint
标头。
拦截和打印历史
intercept()
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
String output = "History:\n";
List historyList = (List)exchange.getProperty(Exchange.MESSAGE_HISTORY);
for (int i = 0; i < historyList.size(); i++) {
DefaultMessageHistory messageHistory = (DefaultMessageHistory)historyList.get(i);
output += "\t[" + (i + 1) + "]"
+ messageHistory.getRouteId() +":"
+ messageHistory.getNode().getShortName()
+ "\n";
}
System.out.println(output);
}
});
然而,这对您没有多大帮助,因为信息相当有限,并且许多模式(如拆分)创建了具有自己新历史的新交换。但是,对于这些,您可以查看是否CamelSplitIndex
设置了类似的标头,然后确定是否发生了拆分。
如果有任何其他方法可以完全满足我在数据库中存储路由详细信息的需求
您可以保持简单,并使用事件来跟踪交换的状态。只需编写一个处理器或组件,您可以使用它来编写/存储在路由期间发生的事情和时间。您可以将breadcrumbId
其用作唯一 ID 进行交换,因为即使在拆分后这种情况仍然存在。
然后,处理器或自定义组件可以简单地将这些事件流式传输到某个文件或将它们存储到本地数据库(如 sqlite)以进行进一步处理。避免将它们直接发送到外部数据库或服务,以尽量减少对实际路线的影响。
这种图表是我需要从路线中创建的。提前致谢。
你看过Hawtio吗?它已经做了很多。我正在使用 Apache Karaf 运行 Hawtio,它为我提供了路由图和相当详细的路由、端点等分析数据。它也是开源的,因此您可以对其进行修改或将其用作您自己的应用程序的参考。
如果您喜欢自己做类似的事情,您可以考虑使用 JMX 来管理和监控骆驼应用程序。据我了解,Hawtio 在后台使用它来获取有关在 JVM 中运行的应用程序的更多信息。