Лучший способ динамически загружать маршруты в Apache Camel

мы разработали приложение на основе Karaf и Apache Camel. Хотя наше приложение полностью основано на пакетах ( OSGI ), мы также загружаем контекст Camel (и его контексты маршрутов) при запуске, что означает, что мы определили некоторые статические маршруты.

Мой вопрос. Есть ли способ динамически ЗАГРУЗИТЬ маршруты во время работы приложения без необходимости перечитывать контекст верблюда, поскольку это приведет к сбросу/перезапуску уже существующих маршрутов. То же самое относится к уже созданным маршрутам, например, если мы хотим отредактировать уже существующий маршрут.

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

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

Более или менее во время работы приложения будут добавляться, редактироваться, удаляться разные конечные точки + связанные с ними маршруты.

Пожалуйста, порекомендуйте.

Спасибо, Тихо


person Tiho    schedule 29.04.2014    source источник
comment
Если вы смелы, вы можете динамически редактировать маршруты с помощью hawt.io...   -  person vikingsteve    schedule 29.04.2014
comment
Да, мы действительно думали об этом... но это не лучший подход. Скорее, наше намерение состоит в том, чтобы разработать наш плагин Hawt.io, который сделает это за нас, если мы склонны использовать базу данных для маршрутов.   -  person Tiho    schedule 30.04.2014
comment
Концептуально я думаю, что маршруты должны быть в основном статичными и не должны изменяться во время выполнения. Логического выбора в маршрутах и ​​таких вещей, как динамические маршрутизаторы, обычно должно быть достаточно. Если нет, я бы сделал шаг назад и подумал, можно ли их спроектировать по-другому.   -  person vikingsteve    schedule 30.04.2014


Ответы (3)


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

Однако, поскольку вы не верите в этот подход, вы можете легко добавлять и удалять маршруты с помощью методов в CamelContext. Создайте построитель маршрутов, который строит маршруты из вашей базы данных, и используйте addRoutes и removeRoute.

person Petter Nordlander    schedule 29.04.2014

См. также этот пример кулинарной книги, как загружать/редактировать маршруты в формате xml во время выполнения http://camel.apache.org/loading-routes-from-xml-files.html

person Claus Ibsen    schedule 29.04.2014
comment
Ссылка не работает, не могли бы вы обновить свой ответ? - person Abbadon; 14.06.2021

Динамическое добавление/удаление маршрутов не перезапускает/сбрасывает camelContext.

Пожалуйста, найдите образец.

DynamicAddRouteProcessor.java

public class DynamicAddRouteProcessor implements Processor {

@Override
public void process(Exchange paramExchange) throws Exception {

    final String routeId = "DYNANMIC.ROUTE.1";
    Route route = paramExchange.getContext().getRoute(routeId);
    if (null == route) {
        System.out.println("No route exist, creating one with name "); 
        paramExchange.getContext().addRoutes(new RouteBuilder() {
            public void configure() throws Exception {
                from("direct:DYNANMIC.ROUTE.1").routeId(routeId).to("direct:myloggerRoute");
            }
        });
    } else {
        System.out.println("Route already exist, no action"+ route.getId());
    }

}

}

DynamicRemoveRouteProcessor.java

открытый класс DynamicRemoveRouteProcessor реализует процессор {

@Override
public void process(Exchange paramExchange) throws Exception {

    final String routeId = "DYNANMIC.ROUTE.1";
    Route route = paramExchange.getContext().getRoute(routeId);
    if (null != route) {
        System.out.println("Route already exist, deleting it!!!"    + route.getId());
        paramExchange.getContext().stopRoute(routeId);
        paramExchange.getContext().removeRoute(routeId);

    } else {
        System.out.println("No sucn route exist, no action done "
                + routeId);
    }

}

}

план.xml

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="timerToLog">
        <from uri="timer:foo?period=5000" />
        <setBody>
            <method ref="helloBean" method="hello" />
        </setBody>
        <log message="The message contains ${body}" />
        <to uri="mock:result" />
    </route>
    <route id="routeAddition">
        <from uri="timer:foo?period=10000" />
        <process ref="dynamicAddRouteProcessor" />
        <log message="Added new route to context....DONE " />
        <delay ><simple>5000</simple></delay>
        <process ref="dynamicRemoveRouteProcessor" />
        <to uri="mock:result" />
    </route>

    <route id="myloggerRoute">
        <from uri="direct:myloggerRoute" />
        <log message="Route add/removal completed - ${body}" />
        <to uri="mock:result" />
    </route>
</camelContext>

person Venkat    schedule 17.08.2017