我有一条简单的路线,如:
from("direct:fooBar")
.pollEnrich()
.simple("file:in/?fileName=abc.txt")
.process(exchange -> {
// 1
exchange.getIn().getBody(String.class);
})
.split(body().tokenize("\n")).streaming().stopOnException()
.process(exchange -> {
// 2
exchange.getIn().getBody(String.class);
})
abc.txt
它是一个非常庞大的文件,所以我使用split
和streaming
来减少内存开销。
但是我能够在1
抓取文件内容,所以我猜在使用poolEnrich
时整个内容实际上已加载到内存中。
我的假设是否正确?
答案 0 :(得分:4)
否pollEnrich
不会将整个文件加载到内存中。文件端点只为您提供文件的文件句柄,例如java.io.File
。
当您告诉Camel将邮件正文转换为String
时,它在处理器中将代码加载到内存中。然后,Camel会将java.io.File
加载到内存中,并将其内容作为String
提供。
因此,如果您想以流式方式阅读正文,则可以使用String
代替InputStream
。
带有tokenizer的分割器将使用java.util.Scanner
来读取文件的块并按块处理该块。这样就可以使用文件端点并通过FileInputStream
读取它。
因此,删除自己的代码,将消息体作为String
,并且不应将整个文件加载到内存中。