Я недавно начал играть с 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 (я не планирую взаимодействовать с несколькими контекстами, но в любом случае я сделал это), оба не исключение, но маршруты отключения никогда не бывают удар. У меня есть несколько вопросов
- Возможно, я неправильно использовал шаблон производителя? Не похоже, что это создает обмен.
- Могу ли я даже использовать ProducerTemplate, как только будет инициирован перехват выключения? Я не уверен, как Camel выполняет выключение, но имеет смысл, что он не позволит отправлять новые сообщения, и если маршрут выключения доступен даже во время отправки.
Стоит отметить, что здесь я не рассматриваю, что маршрут отключения завершается после того, как маршрут обработки завершит обработку всех сообщений в своей очереди. Я не совсем уверен, вызывается ли метод onStop () после того, как больше нет внутренних сообщений, и если нет, как применить его?
Я полагаю, что другой подход заключается в использовании когда / выбор в начале каждого маршрута и отправке какого-либо уведомления о выключении или сообщения, но это кажется немного более грубым.
Спасибо, ребята!