Как инициировать маршрут и собирать результаты с помощью Apache Camel?

Маршрут А запускается компонентом кварца2 (по расписанию cron). Когда маршрут A завершает свою бизнес-логику, в некоторых случаях мне нужно инициировать маршрут B, который будет читать все файлы из заданного каталога и отправлять результаты на другой маршрут C, но нежелательно оставлять маршрут B работающим все время.

Как запустить маршрут B только один раз, когда он нужен маршруту A? В настоящее время я использую команду «controlbus:» на маршруте A для запуска маршрута B (autoStart=false), а маршрут C снова использует «controlbus:» для остановки маршрута B. Не могли бы вы предложить лучшее решение для моего варианта использования?


person Martin V.    schedule 13.05.2015    source источник


Ответы (1)


«Маршрут A» реализует потребителя пула, который опрашивает все файлы из заданного каталога (по мере повторения). Опрос будет остановлен, так как мы получим нулевое тело (проверьте http://camel.apache.org/file2.html опция sendEmptyMessageWhenIdle)

public void process(Exchange exchange) throws Exception {

List<GenericFile> result = new ArrayList<GenericFile>();    
String endpointUrl  = "file:////tmp?sendEmptyMessageWhenIdle=true"
PollingConsumer pConsumer = camelContext.getEndpoint(endpointUrl).createPollingConsumer();

pConsumer.start();

GenericFile<File> gFile;

do {
    Exchange ex = pConsumer.receive(SCAN_TIMEOUT);
    gFile = (GenericFile<File>) ex.getIn().getBody();
    if(gFile != null) {
        result.add(gFile);
    }
// use &sendEmptyMessageWhenIdle=true in file endpoint url OR set receive timeouts otherwise you will never know when folder scan has finished !!!
} while(gFile != null);

pConsumer.stop();

// other business logic 

}
person Martin V.    schedule 14.05.2015