Я создал динамические c маршруты на основе файлов свойств через класс RouteDefinition. Контекст верблюда загружает все XML и свойства маршрутов при запуске, автозапуск (false). DynamicRouterBean (@DynamicRouter) инициализирует маршруты и запускает маршруты один за другим последовательно. Когда маршрут (процесс загрузки по FTP) завершен, маршрут должен быть остановлен, и начинается следующий маршрут (другой процесс по FTP). Все работает, как и ожидалось, за исключением случая, когда dynamicRouter останавливает текущий маршрут и начинает следующий маршрут из routeList. Все маршруты, запускаемые bean-компонентом dynamicRouter, останавливаются напрямую, а не после завершения процесса FTP, настоящий процесс FTP даже не запускается. Когда я пропускаю процесс остановки маршрута, процесс FTP работает как положено. Но когда все маршруты обработаны, а следующий маршрут для обработки равен нулю. CamelContext не выключается. Маршруты продолжают опрашивать удаленные папки.
@DynamicRouter
public Endpoint route(String body, @ExchangeProperties Map<String, Object> properties) throws Exception{
log.info("[DYNAMIC_ROUTER] SLIP_ENDPOINT: {}, previous RouteId: {}",
properties.get(Exchange.SLIP_ENDPOINT), properties.get(PREVIOUS_ROUTEID));
displayExchangeProperties(properties);
Object previousRoute = properties.get(PREVIOUS_ROUTEID); // property will be null on first call
Endpoint nextEndPoint = null;
String nextRouteId = getNextRouteId();
log.debug("[DYNAMIC_ROUTER] Next Route to process {} ",nextRouteId);
if(nextRouteId != null) {
properties.put(PREVIOUS_ROUTEID, nextRouteId);
nextEndPoint = camelContext.getRoute(nextRouteId).getEndpoint();
startRoute(nextRouteId);
}
else{
endTransferProcess();
}
return nextEndPoint;
}
...
private static RouteDefinition downloadRoute(FtpConnection ftpCon, Processor routeDispatcher){
Predicate isCompleted = exchangeProperty(Exchange.BATCH_COMPLETE).isEqualTo(Boolean.TRUE);
log.debug("[ROUTE DEFINITION] Download route");
RouteDefinition rd = new RouteDefinition();
rd.from(ftpCon.getConnectionEndPoint()+"&allowNullBody=true")
.noAutoStartup()
.routeId(ftpCon.getRouteName())
.choice()
.when()
.simple("${in.body} != null")
.log("[DOWNLOAD]====Download File ${file:name} ====")
.to(getDownloadDefinition())
.end()
.onCompletion()
.onWhen(isCompleted)
.log("[DOWNLOAD]==== Route level Download completed! ====")
.end()
;
return rd;
}