在 Apache Camel 中动态加载路由的最佳方法

问题描述 投票:0回答:3

我们开发了基于Karaf和Apache Camel的应用程序。虽然我们的应用程序完全基于捆绑包(OSGI),但我们还在启动时加载Camel上下文(及其“路由上下文”),这意味着我们已经定义了一些静态路由。

我的问题是。有没有一种方法可以在应用程序运行时动态加载路由,而无需重新读取 Camel 上下文,因为这将重置/重新启动已经存在的路由。这同样适用于已经创建的路线,例如,如果我们想要编辑已经存在的路线。

整个想法是,我们计划将路线放入数据库中,因此数据库将由 GUI 进行编辑。

那么最好的方法是什么?我不相信这确实是在添加、编辑路径等情况下重新加载 OSGI 包的最佳方法...

在应用程序运行过程中,或多或少,不同的端点及其相关的路由将被添加、编辑、删除。

请指教。

谢谢, 蒂霍

osgi apache-camel dsl jbossfuse fabric8
3个回答
6
投票

我认为一个好的方法是将你的路由分组到小的上下文中,每个上下文只有几个(甚至可能是单个)路由。然后,您重新加载该小上下文,而不会导致其他路由中断。

但是,由于您不相信这种方法,您可以使用 CamelContext 上的方法轻松添加和删除路由。创建一个路线构建器,从数据库构建路线并使用 addRoutesremoveRoute


3
投票

另请参阅此食谱示例,了解如何在运行时加载/编辑 xml 格式的路由 http://camel.apache.org/loading-routes-from-xml-files.html


2
投票

动态添加/删除路由不会重新启动/重置camelContext。

请找到样品。

动态添加路由处理器.java

public class DynamicAddRouteProcessor implements Processor {
    @Override
    public void process(Exchange paramExchange) throws Exception {

        final String routeId = "DYNANMIC.ROUTE.1";
        Route route = paramExchange.getContext().getRoute(routeId);
        if (null == route) {
            System.out.println("No route exist, creating one with name "); 
            paramExchange.getContext().addRoutes(new RouteBuilder() {
                public void configure() throws Exception {
                    from("direct:DYNANMIC.ROUTE.1").routeId(routeId).to("direct:myloggerRoute");
                }
            });
        } else {
            System.out.println("Route already exist, no action"+ route.getId());
        }
    }
}

动态删除路由处理器.java

public class DynamicRemoveRouteProcessor implements Processor {

    @Override
    public void process(Exchange paramExchange) throws Exception {

        final String routeId = "DYNANMIC.ROUTE.1";
        Route route = paramExchange.getContext().getRoute(routeId);
        if (null != route) {
            System.out.println("Route already exist, deleting it!!!"    + route.getId());
            paramExchange.getContext().stopRoute(routeId);
            paramExchange.getContext().removeRoute(routeId);
            
        } else {
            System.out.println("No sucn route exist, no action done "
                    + routeId);
        }
    }
}

蓝图.xml

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="timerToLog">
        <from uri="timer:foo?period=5000" />
        <setBody>
            <method ref="helloBean" method="hello" />
        </setBody>
        <log message="The message contains ${body}" />
        <to uri="mock:result" />
    </route>
    <route id="routeAddition">
        <from uri="timer:foo?period=10000" />
        <process ref="dynamicAddRouteProcessor" />
        <log message="Added new route to context....DONE " />
        <delay ><simple>5000</simple></delay>
        <process ref="dynamicRemoveRouteProcessor" />
        <to uri="mock:result" />
    </route>

    <route id="myloggerRoute">
        <from uri="direct:myloggerRoute" />
        <log message="Route add/removal completed - ${body}" />
        <to uri="mock:result" />
    </route>
</camelContext>
© www.soinside.com 2019 - 2024. All rights reserved.