【问题标题】:Apache Camel | FTP | Consuming only single file阿帕奇骆驼 | FTP |仅使用单个文件
【发布时间】:2012-09-24 06:37:00
【问题描述】:

我正在尝试读取 ftp 目录中的所有文本文件,并对其进行解析。如果解析成功,则将它们移动到不同的目录(不是默认目录,即 .done 目录),如果解析失败,则文件应保留在 ftp 目录中。这个概念看起来很简单,但是我的路由只从 ftp 读取一个文件,并且路由在获取一个文件后自行结束。

以下是代码:

@Override
    public void configure() throws Exception {

         from(EndPointConstants.DIRECT + GetDriverProductInfo.class.getSimpleName())  
        .pollEnrich(ftp://ingestion_user@10.207.6.42/fantics?password=******&recursive=true)
        .to("file://test/readFile")

是否与 pollEnrich 相关,它只能获取单个文件并且该过程不会递归发生?

【问题讨论】:

    标签: java ftp apache-camel


    【解决方案1】:

    如果解析成功,则将它们移动到不同的目录(不是默认目录,即 .done 目录)

    使用类似下面的例子:

    .to("file://test/readFile?autoCreate=true&moveFailed=.failed/${date:now:yyyyMMdd}/${file:name}&move=.processed/${date:now:dd-MM-yyyy}/${file:name}")
    

    来自 Camel 文档 (FTP/SFTP/FTPS Component):

    默认情况下,FTP 使用者将在远程 FTP 服务器上保留已使用的文件不变。如果您希望它删除文件或将它们移动到另一个位置,则必须明确配置它。例如,您可以使用 delete=true 删除文件,或使用 move=.done 将文件移动到隐藏的 done 子目录中。 常规文件使用者不同,因为它默认将文件移动到 .camel 子目录。 Camel 默认不为 FTP 使用者执行此操作的原因是,默认情况下它可能缺少移动或删除文件的权限。

    所以你可以使用例如:

    &noop=false
    
    &move
    
    &delete=false
    

    编辑:

    我认为你应该想出这样的东西(下面的代码),因为 pollEnrich() 不适合这种情况。

    (强烈建议不要直接使用以下代码,而不是使用示例)

    from("direct:scan")
        .process(new Processor()
        {
            public void process(Exchange exchange) throws Exception
            {
                ConsumerTemplate consumerTemplate = exchange.getContext().createConsumerTemplate();
                ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate();
                producerTemplate.setDefaultEndpointUri("file:..");
                producerTemplate.send(consumerTemplate.receive("ftp:.."));
            }
        });
    

    干杯!

    【讨论】:

    • 感谢您的解决,但问题是别的。我希望 FTP 文件夹中的所有文件都由单个路由使用。目前上面的代码只获取一个文件并停止路由。我想从 FTP 一次获取所有文件,然后遍历路由中的文件列表。任何帮助将不胜感激。
    • 你应该从 ftp 消费,例如 from(ftp),然后它会轮询所有文件。 pollEnrich 用于轮询 single 消息。
    • 正如@ClausIbsen 所说。您可能想要使用 .from(..) 并添加聚合策略 camel.apache.org/aggregator.html 。 ftp 还有一个选项可以遍历 ftp 目录。
    • 感谢@ClausIbsen 和Bagos,但这也不能解决我的问题。早些时候我试图使用 .from(ftp) 但问题是在开发环境中,我们通过使用 ProducerTemplate.sendBody("Test") 从junits运行路由并通过指向路由来配置uri。在这种情况下,我的第一个 from() 是直接:第二个是 .from(ftp),如下所示。运行这条特定的路线不会击中 ftp,并且正文仅包含在 junit 中设置的内容。代码在以下评论中。可以做些什么来解决这个问题。
    • @Override public void configure() throws Exception { from(EndPointConstants.DIRECT + this.getClass().getSimpleName()) .from("ingestion_user@10.207.6.42/fantics?password=*******&recursive=真") .to(ProductFTPURLHelper.getPath()); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2013-02-09
    相关资源
    最近更新 更多