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

A53*_*300 1 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);
  })
Run Code Online (Sandbox Code Playgroud)

abc.txt这是一个非常大的文件,因此我正在使用splitstreaming减少内存开销。但是我可以抓取文件的内容1,因此我猜想使用时整个内容实际上都已加载到了内存中poolEnrich

我的假设正确吗?

Cla*_*sen 5

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

它的代码在处理器加载该文件到内存中,当你告诉骆驼到邮件正文转换为String。然后Camel将加载java.io.File到内存中,并以内容形式提供给您String

因此,如果您想以流式方式阅读正文,String可以使用而不是InputStream

与标记者分路器将使用java.util.Scanner读取该文件的数据块和块处理该块。这样就可以使用文件端点并通过读取它FileInputStream

因此,除去自己的代码,你得到的消息体作为一个String和它应该将整个文件无法加载到内存中。