Как дождаться завершения задания JDBC Apache Camel
У меня есть цикл в моем коде, который генерирует потоки верблюда apache. Однако каждое из этих заданий требует опроса из базы данных Oracle, что приводит к ошибке Максимальное количество сеансов на пользователя. Причина в том, что эти задания являются асинхронными, что приводит к достижению приложением предела количества подключений к базе данных. Следовательно, мне нужен способ дождаться завершения потока, а затем запустить следующий. Мне было интересно, есть ли способ сделать это? Я пытался использоватьThread.sleep
в конце каждого цикла, но не вышло.
for (int i=0; i<tasks.size(); i++) {
DataStore sourceStore = dataStores.get(tasks.get(i));
DataSource source = sourceStore.getDataSource();
DefaultRegistry registry = new DefaultRegistry();
registry.bind(tasks.get(i).getName(), source);
CamelContext context = new DefaultCamelContext(registry);
try {
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from ("direct:start")
.to("jdbc:" + tasks.get(i).getSourceDataStoreName())
.split(body())
// some other job
;
}
});
} catch (Exception e) {
e.printStackTrace();
}
context.start();
ProducerTemplate producerTemplate = context.createProducerTemplate();
producerTemplate.sendBody("direct:start", sourceStore.getQuery(tasks.get(i)));
//Thread.sleep(40000); // did not work
}
1 ответ
Думаю, стоит попробовать Завершение. Согласно документации, маршрут послеonCompletion()
вызывается только после завершения исходного маршрута. Ты можешь делать свою работу послеonCompletion()
, например, вы можете куда-нибудь отправить результат вашей задачи.
Вот мой простой onCompletion()
пример:
context.addRoutes(new RouteBuilder()
{
@Override
public void configure() throws Exception
{
from("timer://mytimer?repeatCount=2&fixedRate=true&period=3000")
.process(exchange -> {
System.out.println("Thread will sleep 2s");
Thread.sleep(2000);
}).onCompletion().process(exchange -> System.out.println("After completion"));
}
});