我们开发了基于Karaf和Apache Camel的应用程序。虽然我们的应用程序完全基于捆绑包(OSGI),但我们还在启动时加载Camel上下文(及其“路由上下文”),这意味着我们已经定义了一些静态路由。
我的问题是。有没有一种方法可以在应用程序运行时动态加载路由,而无需重新读取 Camel 上下文,因为这将重置/重新启动已经存在的路由。这同样适用于已经创建的路线,例如,如果我们想要编辑已经存在的路线。
整个想法是,我们计划将路线放入数据库中,因此数据库将由 GUI 进行编辑。
那么最好的方法是什么?我不相信这确实是在添加、编辑路径等情况下重新加载 OSGI 包的最佳方法...
在应用程序运行过程中,或多或少,不同的端点及其相关的路由将被添加、编辑、删除。
请指教。
谢谢, 蒂霍
我认为一个好的方法是将你的路由分组到小的上下文中,每个上下文只有几个(甚至可能是单个)路由。然后,您重新加载该小上下文,而不会导致其他路由中断。
但是,由于您不相信这种方法,您可以使用 CamelContext 上的方法轻松添加和删除路由。创建一个路线构建器,从数据库构建路线并使用 addRoutes 和 removeRoute。
另请参阅此食谱示例,了解如何在运行时加载/编辑 xml 格式的路由 http://camel.apache.org/loading-routes-from-xml-files.html
动态添加/删除路由不会重新启动/重置camelContext。
请找到样品。
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());
}
}
}
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);
}
}
}
<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>