Camel - RoutePolicy на основе запроса - PullRequest
0 голосов
/ 01 мая 2019

У меня есть несколько верблюжьих процессов, работающих по таймеру, и некоторые маршруты, которые опрашивают конечную точку JMS.Я хотел бы реализовать RoutePolicy для запуска запроса к БД, чтобы определить, следует ли продолжить с маршрутом или нет.Возможно, в методе "onExchangeBegin", если это правильное местоположение.

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

Если кто-то может указать мне на пример кода или подход, я был бы признателен

Спасибо

1 Ответ

0 голосов
/ 02 мая 2019

Чтобы создать политику маршрутизации, необходимо реализовать интерфейс RoutePolicy или использовать класс org.apache.camel.support.RoutePolicySupport, предоставляемый Camel для удобства. Таким образом, ваш класс политики должен быть как

class MyRoutePolicy extends RoutePolicySupport{...}

Как вы сказали в своем описании, onExchangeBegin не будет работать в случае JMS, поскольку оно будет использовать ваше сообщение, поэтому сообщение будет потеряно.

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

Итак, вы можете создать новый маршрут, начиная с таймера, скажем, каждые 10 секунд, который будет выполнять запрос к БД, который вы хотите. На этом маршруте вы примените свою политику и будете использовать onExchangeDone. Таким образом, если результат в порядке, включите маршрут JMS или отключите его. Примерно так:

public void onExchangeDone(Route route, Exchange exchange) {

    //check the result of the query
    ... exchange.getIn().getBody() ...

    // If result is ok (enable JMS route)
    CamelContext context = exchange.getContext();

    if(ok){
        try {
            context.startRoute("JMSRoute");
        } catch (Exception e) {
            getExceptionHandler().handleException("Exception occured during staring route ", e);
        }
    }
    // If result is not ok (disable JMS route)
    else{
        try {
            context.getInflightRepository().remove(exchange, "JMSRoute");
            context.stopRoute("JMSRoute");
        } catch (Exception e) {
            getExceptionHandler().handleException("Exception occured during stoping route ", e);
        }
    }
}

Если вы хотите добавить одну и ту же политику маршрутов во многие маршруты, вы можете просто добавить routePolicyRef (XML DSL) или routePolicy (Java DSL) в свои маршруты. Например

<bean id="myRoutePolicy" class="com.xxx.MyRoutePolicy"/>

<route id="route1" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route2" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route3" routePolicyRef="myRoutePolicy"> ... </route>

Или используйте RoutePolicyFactory, см. Подробнее в https://camel.apache.org/routepolicy.html section Использование RoutePolicyFactory .

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