Выполните маршрут Shutdown Logic с верблюдом Apache - PullRequest
0 голосов
/ 04 мая 2018

Я недавно начал играть с Apache Camel, и одна из проблем, с которой у меня возникли проблемы, - это правильное выполнение логики выключения на отдельных маршрутах. Поскольку логика выключения может отличаться в зависимости от маршрута, RoutePolicy от Camel имеет больше смысла. Вот пример того, почему я пытаюсь это сделать.

public class ProcessingRouteBuilder extends RouteBuilder {
  private ProducerTemplate prodTemplate;

  public class ProcessingRouteBuilder(ProducerTemplate aProdTemplate) {
    prodTemplate = aProdTemplate; 
  }

  @Override
  public void configure() {
    from("direct://processing")
      .routePolicy(new RoutePolicySupport() {
        @Override
        public void onStop(Route route) {
          super.onStop(route);
          prodTemplate.sendBody("direct://shutdownRoute", "msg");
        }
      })
      .process(ex -> // Do stuff)

    from("direct://shutdownRoute")
      .log("Running shutdown A route body - ${body}");
  }
}

Завершение работы выполняется следующим образом (http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html). ProducerTemplate происходит от основного CamelContext (прочитайте, что рекомендуется создать один ProducerTemplate для контекста).

Выполнение этого дает мне исключение DirectConsumerNotAvailableException, я использовал seda и vm (я не планирую взаимодействовать с несколькими контекстами, но в любом случае я сделал это), оба не исключение, но маршруты отключения никогда не бывают удар. У меня есть несколько вопросов

  1. Возможно, я неправильно использовал шаблон производителя? Не похоже, что это создает обмен.
  2. Могу ли я даже использовать ProducerTemplate, как только будет инициирован перехват выключения? Я не уверен, как Camel выполняет выключение, но имеет смысл, что он не позволит отправлять новые сообщения, и если маршрут выключения доступен даже во время отправки.

Стоит отметить, что здесь я не рассматриваю, что маршрут отключения завершается после того, как маршрут обработки завершит обработку всех сообщений в своей очереди. Я не совсем уверен, вызывается ли метод onStop () после того, как больше нет внутренних сообщений, и если нет, как применить его?

Я полагаю, что другой подход заключается в использовании когда / выбор в начале каждого маршрута и отправке какого-либо уведомления о выключении или сообщения, но это кажется немного более грубым.

Спасибо, ребята!

1 Ответ

0 голосов
/ 04 мая 2018

Для программного отключения маршрута вы также можете использовать Control Bus EIP .

Однако логика «остановки» не ясна, так как вы хотите отправить сообщение на shutdownroute , когда обработка останавливается, но если остановка произойдет, потому что вы при закрытии верблюжьего контекста может быть возможно, что shutdownRoute уже остановлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...