如何在完成之前的路线后启动骆驼路线?

时间:2015-09-02 15:44:06

标签: 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/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();
}

我只是将它添加到上下文并启动上下文。但是当我这样做时它没有给出正确的输出(即我的输入文件大小是4.1 MB,但它只产生664 kb输出文件)。我认为可能是因为连续路由。为了测试目的,我首先评论了最后两个路由并启动了上下文,然后注释了第一个和最后一个并重新启动了只有一个路由的上下文,最后注释了前两个并再次重新启动了上下文只有最后的路线。现在工作正常。但是当我一次运行所有路线时,为什么它会给出错误的结果。

是否有任何解决方案可以避免此问题?

请建议我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的文件生产者将文件写入存储库,文件使用者从同一存储库中使用文件,而不知道该文件是否仍在写入。

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

或者其他方面,您可以使用使用者模板手动调用任何使用者。您可以调用spring bean或producer,您可以使用使用者模板来使用文件。

希望有所帮助:)