首页 > 解决方案 > 如何等待 Apache Camel JDBC 作业完成

问题描述

我的代码中有一个循环,可以生成 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
}

标签: javaapache-cameldata-integrationcamel-jdbc

解决方案


我认为您应该尝试onCompletion。根据文档,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"));
        }
});

推荐阅读