2014-02-13 2 views
3

Я хочу контролировать, когда мой маршрут запускается с использованием RoutePolicy. Поэтому я определил его autoStartup = ложьКак начать маршрут верблюда с autoStartup = false

<camel:route id="myRoute" routePolicyRef="myRoutePolicy" autoStartup="false"> 
    <!-- details omitted --> 
</camel:route> 

Чтобы начать маршрут, я попробовал:

public class MyRoutePolicy implements RoutePolicy { 

    // Does NOT work! 
    @Override 
    public void onInit(Route route) { 
     if(shouldStartRoute(route)) { 
      camelContext.startRoute(route.getId()); 
     } 
    } 

    // More stuff omitted 
} 

К сожалению, ничего не происходит. Javadoc для CamelContext.startRoute(String) может объяснить, почему:

Запускает данный маршрут, если он был ранее остановлен

Как начать маршрут, который ранее не был остановлен?

Я использую Camel 2.8.0, и обновление не является вариантом.

Я могу начать маршрут с помощью консоли JMX, но я не хочу зависеть от JMX.

+0

Вы изучали [правила маршрута] (https://camel.apache.org/routepolicy.html)? Однако с Camel 2.8 вы получаете ограниченную поддержку. Возможно, он по-прежнему работает на вас. – Ralf

+0

@ Ralf Да, я называю 'camelContext.startRoute (« myRoute »);' из политики маршрута в попытке начать маршрут –

ответ

3

Я отлаживал Верблюд. Кажется, что CamelContext.startRoute(String) не запускает маршрут с autoStartup = false.

Правильный путь, чтобы начать маршрут является:

ServiceHelper.startService(route.getConsumer()); 

Но это не сработало для меня в моей RoutePolicy:

public class MyRoutePolicy implements RoutePolicy { 

    // Does NOT work either! 
    @Override 
    public void onInit(Route route) { 
     if(shouldStartRoute(route)) { 
      ServiceHelper.startService(route.getConsumer()); 
     } 
    } 

    // More stuff omitted 
} 

Проблема здесь состоит в том, что route.getConsumer() возвращается null. Вам нужно подождать, пока контекст Camel не будет инициализирован для вызова ServiceHelper.startService(consumer). Так вот то, что делает работу:

public class MyRoutePolicy extends EventNotifierSupport implements RoutePolicy { 
    private final Collection<Route> routes = new HashSet<>(); 

    @Override 
    public void onInit(Route route) { 
     routes.add(route); 
     CamelContext camelContext = route.getRouteContext().getCamelContext(); 
     ManagementStrategy managementStrategy = camelContext.getManagementStrategy(); 
     if (!managementStrategy.getEventNotifiers().contains(this)) { 
      managementStrategy.addEventNotifier(this); 
     } 
    } 

    // Works! 
    @Override 
    public void notify(EventObject event) throws Exception { 
     if(event instanceof CamelContextStartedEvent) { 
      for(Route route : routes) { 
       if(shouldStartRoute(route)) { 
        ServiceHelper.startService(route.getConsumer()); 
       } 
      } 
     } 
    } 

    // More stuff omitted 
} 
+0

является проблемой для Camel Jira для этого? –

+0

Нет, это не ошибка –

1

При использовании Java DSL вы можете определить свой маршрут согласно примеру: from("myEndpoint").autoStartup(isMyConfigEnabled())..., где isMyConfigEnabled() является метод, имеющий логику вашего маршрута, чтобы быть запущен или нет.

Смежные вопросы