【问题标题】:Apache camel file with doneFileName带有 doneFileName 的 Apache 骆驼文件
【发布时间】:2016-01-27 21:51:47
【问题描述】:

我刚开始看 apache camel(使用蓝图路由),我已经卡住了。

我需要处理一组不同格式的 csv 文件。我得到 5 个带有 foo_X_20160110.csv 的文件,其中 X 指定了 csv 文件的类型并且这些文件有一个日期戳。这些文件可能非常大,因此一旦写入所有文件,就会写入“完成”文件。完成的文件名为 foo_trigger_20160110.csv。

我已经在文件上看到了 doneFileName 选项,但它只支持静态名称(我在文件名中有一个日期),或者它希望每个输入文件都有一个完成文件。

文件必须按固定顺序处理,但不能保证将它们写入输入目录的顺序。因此我需要等待完成的文件。

知道如何使用 Camel 完成此操作吗?

有什么好的骆驼书推荐吗?

【问题讨论】:

  • 您好,这是几个问题。你能更详细地说明你要问的是哪个问题吗?至于书籍,你应该从主要书籍 Camel in Action 开始,然后是 Camel Cookbook。
  • 感谢推荐书。主要问题是如何将文件 URI 配置为使用非静态完成文件,并且仅在该 0 字节完成文件(根据日期更改名称)存在时处理目录中的其他文件

标签: apache-camel eip


【解决方案1】:

这是文档中的一个示例 http://camel.apache.org/file2.html

from("file:C:/temp/input.txt?doneFileName=done");

如您所见,doneFileName 有一个静态值“done”。但是您可以使用标准 java 编写动态名称,即当前日期格式或其他任何名称,只需使用字符串操作来构造 URI。希望对您有所帮助。

更新:

顺便说一句,如文档中所述,doneFileName 可以选择动态占位符。

但是更常见的是每个目标文件都有一个完成文件。这 表示存在 1:1 的相关性。为此,您必须使用动态 doneFileName 选项中的占位符。目前 Camel 支持 以下两个动态标记:file:name 和 file:name.noext 必须 包含在 ${ } 中。消费者只支持静态部分 done 文件名作为前缀或后缀(不是两者)。

from("file:bar?doneFileName=${file:name}.done");

你也可以给完成的文件加上前缀,比如:

from("file:bar?doneFileName=ready-${file:name}");

【讨论】:

  • 谢谢,您能否详细说明如何调用 Java 从文件 URI 创建动态名称?抱歉还早。骆驼行动书明天到货
  • 我想一种选择是使用 GenericFileProcessStrategy 的自定义 processStrategy?
  • 我认为你不需要那个。使用标准 java 我的意思是,如果完成的文件的名称为“currentdate”.txt,其中 currentdate 是今天的日期。然后,您只需找到使用标准 java 并将其连接起来以创建 URI。这应该是获得动态完成文件名的一种方法。
  • 如果我使用 Java DSL 设置路线,是的,我可以在第一天轻松做到这一点,但该应用程序可能会运行多天,并且路线只设置一次。那么我该如何改变呢?使用蓝图 XML 时如何获取动态文件名?
  • 我不确定你所说的第一次约会是什么意思。在java中你可以得到currentdate,这意味着今天的日期,它会给你明天运行它的日期,后天等等。这是一种方法。 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多