Как остановить динамический маршрут верблюда при исключении

Как остановить верблюжий маршрут, если есть исключение. Мой динамический маршрут потребляет jms и отправляет в реактивную конечную точку.

camelContext.addRoutes(New GenerateRoute());

Класс генератора маршрута выглядит следующим образом:

public class GenerateRoute extends RouteBuilder {

@Override
public void configure() {
    from("jms:queue:myQueue")
        .toF("reactive-streams:myStream").setId("myRoute");
}}

person user3549576    schedule 01.07.2020    source источник
comment
@KavithakaranKanapathippillai да, я хочу, чтобы мой маршрут навсегда остановился.   -  person user3549576    schedule 01.07.2020


Ответы (2)


Попробуй это

    from("jms:queue:myQueue")
            .routeId("myRoute")
            .doTry()
                .toF("reactive-streams:myStream")
            .doCatch(Exception.class)
                .process(exchange -> exchange.getFromEndpoint().stop())
            .end();
person Kavithakaran Kanapathippillai    schedule 01.07.2020
comment
Вы имеете в виду doCatch() вместо doFinally() правильно? Так как мне нужно остановить маршрут только тогда, когда есть исключение. - person user3549576; 01.07.2020
comment
Благодарю вас! Кроме того, я считаю, что это все равно потеряет одно сообщение из очереди jms, верно? Если да, есть ли способ добавить транзакцию? - person user3549576; 01.07.2020
comment
Спасибо! еще один вопрос... находится ли .routeId в правильном месте, если я хочу снова начать маршрут позже? - person user3549576; 01.07.2020
comment
Как мне добавить транзакцию, чтобы сообщение, вызвавшее исключение, не потреблялось и оставалось в очереди jms? - person user3549576; 05.07.2020
comment
Я добавил дополнительный вопрос здесь stackoverflow.com/questions/62743621/ - person user3549576; 05.07.2020

Вы можете использовать handled и continued. в пункте onException. Продолжение позволяет вам как обрабатывать, так и продолжать маршрутизацию по исходному маршруту, как если бы исключения не возникло. если continued равно false, маршрутизация не вернется к исходному маршруту.

DSL:

<onException>
    <exception>java.lang.IllegalArgumentException</exception>
    <continued><constant>false</constant></continued>
</onException>

Ява:

onException(IllegalArgumentException.class).continued(fasle);

См.: https://camel.apache.org/manual/latest/exception-clause.html#

person Poorya Hosseini    schedule 01.07.2020
comment
Будет ли это корректно завершать только сгенерированный маршрут? Я обновил свой вопрос кодом, который у меня есть. Это выглядит так, как показано ниже? - person user3549576; 01.07.2020
comment
Ваш вопрос мне неясен. Что делает continued, так это обработка исключения. Если вы хотите вернуть элемент управления обратно на маршрут, тогда продолжение равно true, в противном случае вы можете установить его как false. Если handled истинно, возникшее исключение будет удалено в обмене, в противном случае оно останется в обмене, и вы все равно сможете получить его из обмена, используя: Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class); Это - person Poorya Hosseini; 01.07.2020
comment
Я могу привести пример: если сообщение читается из очереди и отправляется по другому маршруту, например direct:enrich-message, который обогащает сообщение, а затем изdirect:enrich-message вы отправляете его в direct:send-to-mysystem, откуда вы отправляете его в reactive-streams:myStream, если у вас есть continued=true и handled=false в предложении onException direct:send-to-mysystem, тогда обмен будет отправлен обратно на маршрут direct:enrich-message с перехваченным исключением в обмене. - person Poorya Hosseini; 01.07.2020
comment
Я ищу способ полностью остановить маршрут, чтобы маршрут больше не потреблял из JMS. В основном context.getRoute(myRoute).getConsumer.stop(). Как я понимаю, continue(false) по-прежнему будет потреблять JMS. Будет ли в этом случае работать транзакция? - person user3549576; 01.07.2020
comment
Затем вам нужно остановить весь маршрут. См.: camel.apache.org/manual/latest/faq/ - person Poorya Hosseini; 01.07.2020
comment
Более того, я думаю, вам также нужно изменить свой вопрос. - person Poorya Hosseini; 01.07.2020
comment
См. также это: camel.apache.org/manual/latest/lifecycle.html - person Poorya Hosseini; 01.07.2020