当前位置: 首页 > 知识库问答 >
问题:

Apache Camel,将文件移动到的重排序器。骆驼

简景焕
2023-03-14

我正在尝试重新排序在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来解决这个问题,从而将文件路径更改为中的路径。骆驼目录,但这对我来说似乎有点混乱。另一个选项是对文件名而不是文件重新排序(即,mesage的主体是作为字符串的文件名,而不是一般文件)。

是否有人在文件上使用了重排程序并可以提供建议?

共有1个答案

水昊阳
2023-03-14

停止将文件移动到。camel您可以在route builder的configure方法中将noop参数添加到文件使用者。如果使用Camel 1,您可以在此处阅读相关内容。x或此处(如果使用驼峰2.0以后的版本)

from("file://target/input?noop=true")

将文件移动到中的原因。camel目录与重排程序无关,而是camel中的实际文件生成器,如文档中所述:

默认情况下,Camel会将已使用的文件移动到子文件夹。相对于文件的使用位置的驼峰。

之后将跳过这些文件,因为Camel会忽略任何以点开头的文件。

希望这有帮助。

 类似资料:
  • 我需要将文件从文件夹同步到restendpoint。因此,如果文件被放置在特定文件夹中,我需要将该文件发送到接受多部分文件的RESTendpoint。我正在使用ApacheCamel来实现这一点。 RESTendpoint在Spring中编写,如下所示: 我是Camel的新手,并且已经弄清楚了如何通过构建路由并获取文件来轮询目录,但是我无法弄清楚如何使用此路由将此文件放入其余endpoint。这是

  • Im面临的问题是将多个文件加载到轮询文件夹中,有些文件被处理并移动到已处理路径,有些文件未经处理直接移动到已处理路径

  • 我正在尝试使用shutil库将文件移动到回收站。下面是相关的代码行,但我得到了一个奇怪的错误。这两个文件都是本地文件,我可以访问电脑上的两个位置。为什么会发生此错误?因为我用的是Main。从F复制它:? 错误消息 F: \Python\Project\venv\Scripts\Python。exe“C:\Program Files\JetBrains\PyCharm Community Editi

  • 我试图将"/var/lib/docker"文件夹从一个磁盘移动到另一个磁盘,因为这占用了太多的空间。我一直遇到一些与权限相关的错误! 根据这些问题: 如何将docker容器的映像移动到永久磁盘 如何在另一个分区上运行docker LXC容器 我的磁盘安装在"/data"上,我将"/var/lib/docker"文件夹复制到"/data/docker" 这就是我所尝试的: 使用“/data/DOCK

  • 我需要允许我网站上的用户在上传后从服务器上删除他们的图像,如果他们不再需要它们。我以前在PHP中使用函数,但后来被告知这可能是相当危险的,也是一个安全问题。(下面以前的代码:) 相反,我现在想简单地将文件移动到不同的文件夹。这必须能够在他们第一次上传文件后很长时间内完成,这样他们就可以随时登录他们的帐户。如果我有存储用户图像的主文件夹: 然后在该文件夹中放置一个名为del的文件夹,该文件夹是放置不