5

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

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

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

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

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

请指教。

谢谢,蒂霍

4

3 回答 3

6

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

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

于 2014-04-29T05:52:13.157 回答
3

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

于 2014-04-29T06:11:28.600 回答
2

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

请找到样品。

DynamicAddRouteProcessor.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());
    }

}

}

DynamicRemoveRouteProcessor.java

公共类 DynamicRemoveRouteProcessor 实现处理器 {

@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>

于 2017-08-17T16:24:33.633 回答