我正在尝试重新排序在Apache Camel上编写的应用程序提取文件的顺序。需要按设定顺序处理文件,如果应用程序没有按顺序获取文件,则文件中数据的各种聚合和其他处理将失败。为了保护应用程序,我试图使用重定序器EIP来确保按顺序处理文件。但是我发现重新排序器似乎导致文件在下游组件通过交换之前被移动到.camel目录中。
我写了一个简单的例子来说明问题:
import java.io.File;
import java.io.IOException;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
public class CamelFileResequencerTest extends CamelTestSupport {
@Test
public void test() throws IOException, InterruptedException {
File file1 = new File("target/input/1.txt");
FileUtils.write(file1, "Hello Camel");
FileUtils.write(new File("target/input/2.txt"), "Hello Camel");
FileUtils.write(new File("target/input/3.txt"), "Hello Camel");
Thread.sleep(100l);
assertTrue(file1.exists());
FileUtils.write(new File("target/input/4.txt"), "Hello Camel");
FileUtils.write(new File("target/input/5.txt"), "Hello Camel");
Thread.sleep(5000l);
assertTrue(new File("target/output/1.txt").exists());
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file://target/input")
.resequence(header(Exchange.FILE_NAME_ONLY)).batch().size(3)
.to("file://target/output/");
}
};
}
}
测试在尝试写入输出文件时抛出异常,因为输入文件不再位于输入目录中,但已移至/target/input/.camel目录。
现在我可以通过在重定序器之后添加处理bean来改变文件路径到.camel目录中的路径来解决这个问题,但这对我来说似乎有些麻烦。另一种选择是重新排序文件名而不是文件(即mesage的主体是文件名作为字符串而不是通用文件)。
有没有人在文件上使用了重新排序器并可以提供建议?
答案 0 :(得分:1)
要停止将文件移动到.camel,可以在路径构建器的configure方法中将noop参数添加到文件使用者。您可以阅读有关此here if using Camel 1.x或here if using Camel 2.0 onwards
的信息from("file://target/input?noop=true")
文件移入.camel目录的原因与重定序器有关,而与Camel中的实际文件生成器无关,如文档中所述:
默认情况下,Camel会将使用过的文件移动到相对于文件被占用位置的子文件夹.camel。
此后会跳过这些文件,因为Camel会忽略任何以点开头的文件。
希望这有帮助。