Apache camel 如何在完成前一条路线后才开始骆驼路线?

Apache camel 如何在完成前一条路线后才开始骆驼路线?,apache-camel,Apache Camel,我的RouteBuilder中有多条路由,如下所示 from( "hdfs://localhost:8020/user/cloudera/input/CamelTestIn.csv?fileSystemType=HDFS") .to("file:/home/cloudera/Desktop/camelout/?fileName=CamelTestIn.csv&fileExist=Append"); from("file:/home

我的RouteBuilder中有多条路由,如下所示

from(
            "hdfs://localhost:8020/user/cloudera/input/CamelTestIn.csv?fileSystemType=HDFS")
            .to("file:/home/cloudera/Desktop/camelout/?fileName=CamelTestIn.csv&fileExist=Append");

    from("file:/home/cloudera/Desktop/camelout/?fileName=CamelTestIn.csv&noop=true")

            .unmarshal(csv)
            .convertBodyTo(List.class)
            .process(new Processor() {

                @Override
                public void process(Exchange msg) throws Exception {
                    List<List<String>> data = (List<List<String>>) msg
                            .getIn().getBody();
                    for (List<String> line : data) {

                        // System.out.println("line "+line);
                        if ("1502873".equals(line.get(3))) {
                            line.set(18, "Y");
                        }
                    }
                }
            })
            .marshal(csv)
            .to("file:/home/cloudera/Desktop/mytemp/?fileName=outRes.csv");


            from(
            "file:/home/cloudera/Desktop/mytemp/?fileName=outRes.csv&noop=true")
            .to("hdfs://localhost:8020/user/cloudera/output/?fileSystemType=HDFS")

            .end();
}
来自(
"hdfs://localhost:8020/user/cloudera/input/CamelTestIn.csv?fileSystemType=HDFS")
.to(“文件:/home/cloudera/Desktop/camelout/?fileName=CamelTestIn.csv&fileExist=Append”);
从(“文件:/home/cloudera/Desktop/camelout/?fileName=CamelTestIn.csv&noop=true”)
.unmarshal(csv)
.convertBodyTo(List.class)
.进程(新处理器(){
@凌驾
公共作废进程(Exchange msg)引发异常{
列表数据=(列表)消息
.getIn().getBody();
用于(列表行:数据){
//系统输出打印项次(“行”+行);
如果(“1502873.”等于(line.get(3))){
第18行(Y);
}
}
}
})
.marshal(csv)
.to(“文件:/home/cloudera/Desktop/mytemp/?fileName=outRes.csv”);
从(
“文件:/home/cloudera/Desktop/mytemp/?fileName=outRes.csv&noop=true”)
.至(”hdfs://localhost:8020/user/cloudera/output/?fileSystemType=HDFS")
.end();
}
我只是将它添加到上下文并启动上下文。但是当我这样做时,它并没有给出正确的输出(即,我的输入文件大小为4.1MB,但它只生成664KB的输出文件)。我认为这可能是因为连续路由。因此,出于测试目的,首先我对最后两条路由进行了注释,并启动了上下文,然后对第一条和最后一条进行了注释,并再次仅使用一条路由重新启动了上下文,最后对前两条进行了注释,并再次仅使用最后一条路由重新启动了上下文。现在它工作正常。但是为什么当我一次运行所有路线时会给出错误的结果

有什么办法可以避免这个问题吗

请推荐我


提前感谢。

您的文件制作者将文件写入存储库,而您的文件使用者使用同一存储库中的文件,而不知道该文件仍在写入中

Pl引用camel文件组件中的readLock选项。如果您根据需要设置了适当的读锁,则camel文件组件将不会使用正在写入的文件,它将等待文件锁释放

或者,您可以使用使用者模板手动调用任何使用者。您可以调用Springbean或producer,在这里您可以使用使用者模板来使用文件


希望能有所帮助:)

Hi@Gnana Guru,非常感谢您的回复。在停止上下文之前,我们在每个地方都在写线程。像这样睡觉(1000)。但是我如何确切地知道路由是否完成?我有一个类似mycontext.addRoutes(myRoute)的上下文;并试图通过myContext.getRouteStatus(“myRoute”)了解状态,但返回空值