Apache Camel:逐行处理文件
Apache Camel: Process file line by line
我有一个大文件需要读取和处理。我不想将它完全加载到内存中,而是单独读取文件的每一行并对其执行操作。我在工作中接触过这个实现:
@Override
public void configure() {
from(fileSftpLocationUrl)
.routeId("my-route")
.onException(Exception.class).handled(true).bean(exchangeErrorHandler, "processError").end()
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue));
}
在开始阅读文件之前,我跳过了页眉和页脚 .filter(/*condition for skip first and last line*/)
,在下一行中,我尝试开始逐行阅读我的文件 .split(body().tokenize("\n")).streaming()
但是出了点问题,我完整地从文件中获取所有信息。我在解析该数据并对它们执行操作时在 .bean(/*my action*/)
中看到了这个问题。
我认为我的问题在一开始就被隐藏了,因为算法看起来很奇怪,首先我描述了整个文件的条件(跳过页眉和页脚),然后我让骆驼逐行处理,并且只然后是特定行的操作。
我的问题是,如何更改此实现以便逐行处理文件?
我想我明白了。
默认情况下,拆分结果发送到 FIRST 下一个端点
from(...)
.split(body().tokenize("\n")).streaming()
.to("direct:processLine")
如果要发送到复杂的路由,则必须标记拆分结束,例如
from(...)
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue))
.end()
.log("Split done");
如果省略 end(),逻辑将是这个(见缩进):
from(...)
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.end() // Implicit
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue))
-> 在您的尝试中,使用原始消息调用了 bean(...)(在执行拆分后)
将其视为一种“for 循环”
for (String line: lines)
filter(line);
bean.run(line);
sendto(...);
完全不同于:
for (String line: lines) {
filter(line);
bean.run();
sendto(...);
}
我有一个大文件需要读取和处理。我不想将它完全加载到内存中,而是单独读取文件的每一行并对其执行操作。我在工作中接触过这个实现:
@Override
public void configure() {
from(fileSftpLocationUrl)
.routeId("my-route")
.onException(Exception.class).handled(true).bean(exchangeErrorHandler, "processError").end()
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue));
}
在开始阅读文件之前,我跳过了页眉和页脚 .filter(/*condition for skip first and last line*/)
,在下一行中,我尝试开始逐行阅读我的文件 .split(body().tokenize("\n")).streaming()
但是出了点问题,我完整地从文件中获取所有信息。我在解析该数据并对它们执行操作时在 .bean(/*my action*/)
中看到了这个问题。
我认为我的问题在一开始就被隐藏了,因为算法看起来很奇怪,首先我描述了整个文件的条件(跳过页眉和页脚),然后我让骆驼逐行处理,并且只然后是特定行的操作。
我的问题是,如何更改此实现以便逐行处理文件?
我想我明白了。 默认情况下,拆分结果发送到 FIRST 下一个端点
from(...)
.split(body().tokenize("\n")).streaming()
.to("direct:processLine")
如果要发送到复杂的路由,则必须标记拆分结束,例如
from(...)
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue))
.end()
.log("Split done");
如果省略 end(),逻辑将是这个(见缩进):
from(...)
.split(body().tokenize("\n")).streaming()
.filter(/*condition for skip first and last line*/)
.end() // Implicit
.bean(/*my action*/)
.to(String.format("activemq:%s", myQueue))
-> 在您的尝试中,使用原始消息调用了 bean(...)(在执行拆分后)
将其视为一种“for 循环”
for (String line: lines)
filter(line);
bean.run(line);
sendto(...);
完全不同于:
for (String line: lines) {
filter(line);
bean.run();
sendto(...);
}