我可以根据条件暂停或恢复路线吗?

时间:2014-10-08 08:54:39

标签: apache-camel

我希望能够以编程方式控制基于条件的路线,但我找不到办法。 我不想像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之类的事件不会满足此约束,因为消息可能在接收和处理事件之间被消耗。

1 个答案:

答案 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:基本上会做同样的事情;)