camel中使用了哪种企业集成模式

k10s72fa  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(119)

我正在使用Apache camel路由来处理我的消息。在我的用户界面中,我需要显示这些消息,在详细信息页面中,我需要显示路由中的消息流。因此,我计划使用intercept,以便在进入每个模式之前,消息都将被拦截,处理器将在数据库中存储这些消息。但我面临着一个问题,即找出哪个模式最后处理了消息。比如截取是否发生在聚合、拆分或处理之后。在哪种模式之后,我的截取处理器工作。有没有任何方法可以找出这一点,或者如果有任何其他方法可以完全满足我在数据库中存储路由细节的需要,它是可以的。请帮助

这种图是我需要从路由中创建的。提前感谢。

gzjq41n4

gzjq41n41#

我面临着一个问题,即找出最后处理消息的模式。例如,拦截是发生在聚合、拆分还是处理之后。我的拦截处理器在哪个模式之后工作。有没有办法找出这个问题?
您可以从CamelMessageHistory交换属性(DefaultMessageHistory对象清单)取得一些详细数据。这些包含routeId和端点节点的一些详细数据,例如其ID。如果您使用interceptFrom,camel会将拦截的端点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);
        }
    });

但是这对你没有太大帮助,因为信息是相当有限的,很多模式,比如split,会创建一个新的交换,有自己的新历史。但是对于这些模式,你可以查看是否已经设置了像CamelSplitIndex这样的头,如果已经设置了,那么就可以确定已经发生了拆分。
如果有任何其他方法来满足我在DB中存储路由详细信息的需要
你可以让事情变得简单,使用事件来跟踪交换的状态。只要写一个处理器或组件,你可以用它来写/存储在路由过程中发生了什么和什么时候发生的。你可以使用breadcrumbId作为交换的唯一id,因为即使在类似拆分的操作之后,它也会持续存在。
处理器或自定义组件可以简单地将这些事件流到某个文件或将它们存储到本地数据库(如sqlite)以供进一步处理。避免将它们直接发送到外部数据库或服务,以最小化对实际路由的影响。
这种图表是我需要从路线创建。提前感谢。
你看过Hawtio吗?它已经做了很多这样的事情。我用Apache Karaf运行Hawtio,它为我提供了路线图和相当详细的路线、端点等分析数据。它也是open source,所以你可以修改它或将它用作你自己的应用程序的参考。
如果您更喜欢自己做类似的事情,您可以考虑使用JMX来管理和监视camel应用程序。据我所知,Hawtio在后台使用JMX来获取有关JVM中运行的应用程序的更多信息。

相关问题