poolEnrich是否将整个文件内容加载到内存中?

时间:2018-01-17 09:18:18

标签: apache-camel

我有一条简单的路线,如:

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它是一个非常庞大的文件,所以我使用splitstreaming来减少内存开销。 但是我能够在1抓取文件内容,所以我猜在使用poolEnrich时整个内容实际上已加载到内存中。

我的假设是否正确?

1 个答案:

答案 0 :(得分:4)

pollEnrich不会将整个文件加载到内存中。文件端点只为您提供文件的文件句柄,例如java.io.File

当您告诉Camel将邮件正文转换为String时,它在处理器中将代码加载到内存中。然后,Camel会将java.io.File加载到内存中,并将其内容作为String提供。

因此,如果您想以流式方式阅读正文,则可以使用String代替InputStream

带有tokenizer的分割器将使用java.util.Scanner来读取文件的块并按块处理该块。这样就可以使用文件端点并通过FileInputStream读取它。

因此,删除自己的代码,将消息体作为String,并且不应将整个文件加载到内存中。