我希望能够以编程方式控制基于条件的路线,但我找不到办法。
我不想像ProcessorDefinition.stop()
那样停止路线的流动。
我试图创建一个新的RoutePolicy
而没有任何运气。
public class ProjectStateRoutePolicy extends RoutePolicySupport {
// this would be a check to an outside service
private boolean shouldStartRoute = false;
@Override
public void onStart(Route route) {
suspendIfNotInValidState(route);
}
@Override
public void onResume(Route route) {
suspendIfNotInValidState(route);
}
private void suspendIfNotInValidState(Route route) {
if ( !shouldStartRoute) {
try {
suspendRoute(route);
} catch (Exception e) {
throw ObjectHelper.wrapRuntimeCamelException(e);
}
}
}
}
根据我的理解onResume()
等是CamelContext特定的而不是特定于路线的。是否有一个细粒度的机制来了解路线生命周期?
我希望能够控制路线的生命周期,即使某人试图从JMX手动启动路线。
PS:我认为RouteStartedEvent之类的事件不会满足此约束,因为消息可能在接收和处理事件之间被消耗。
答案 0 :(得分:0)
以下是一些可以执行此操作的代码,前提是您具有驼峰上下文和路由名称。
public class StopRoute {
Logger log = LoggerFactory.getLogger(getClass().getName());
public void stop(CamelContext camelContext, String routeId) throws Exception {
log.info("Stopping camel route: " + routeId);
camelContext.stopRoute(routeId, 2, TimeUnit.SECONDS);
}
}
类似于StartRoute。
然后你可以在你的路线中使用它:
.bean(StopRoute.class, "stop(*, " + INCOMING_SNAPSHOTS.routeId() + ")")
希望这有帮助!
P.S。根据我的理解,controlbus:
基本上会做同样的事情;)