Best way to load dynamically routes in Apache Camel

后端 未结 3 599
渐次进展
渐次进展 2021-01-13 04:41

we have developped application based on Karaf and Apache Camel. While our application is entirely based on bundles ( OSGI ) we are also loading the Camel context ( and its\'

相关标签:
3条回答
  • 2021-01-13 05:18

    See also this cookbook example how to load/edit routes form xml format at runtime http://camel.apache.org/loading-routes-from-xml-files.html

    0 讨论(0)
  • 2021-01-13 05:27

    I think a good approach is to group your routes into small contexts with just a few (or maybe even single) routes per context. Then you reload that small context without causing interruption in other routes.

    However, as you don't believe in that approach, you can easily add and remove routes with methods on the CamelContext. Create a route builder that constructs routes from your database and use addRoutes and removeRoute.

    0 讨论(0)
  • 2021-01-13 05:35

    Adding/Removing routes dynamically does not restart/reset camelContext.

    Please find the sample.

    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

    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);
        }
    
    }
    

    }

    blueprint.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>
    

    0 讨论(0)
提交回复
热议问题