我的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输出文件)。我认为可能是因为连续路由。为了测试目的,我首先评论了最后两个路由并启动了上下文,然后注释了第一个和最后一个并重新启动了只有一个路由的上下文,最后注释了前两个并再次重新启动了上下文只有最后的路线。现在工作正常。但是当我一次运行所有路线时,为什么它会给出错误的结果。
是否有任何解决方案可以避免此问题?
请建议我。
提前致谢。
答案 0 :(得分:0)
您的文件生产者将文件写入存储库,文件使用者从同一存储库中使用文件,而不知道该文件是否仍在写入。
Pl引用camel文件组件的readLock选项。如果根据需要设置适当的读锁定,camel文件组件将不会消耗正在写入的文件,它将等待文件锁定被释放。
或者其他方面,您可以使用使用者模板手动调用任何使用者。您可以调用spring bean或producer,您可以使用使用者模板来使用文件。
希望有所帮助:)