带有骆驼和 readLock=none 的流式文件

Streaming file with camel and readLock=none

我正在尝试使用 Apache Camel 使用(流式传输)一个大的 zip 文件。流式传输应在写入文件后立即开始。下面是文件消费者代码。

        rest("/api/request/{Id}/")
            .get()
            .produces(MediaType.APPLICATION_OCTET_STREAM_VALUE)
            .process(new FindFileName)
            .pollEnrich().simple("file:" + outputDir + "?fileName=${property.filnavn}&noop=false&readLock=none&delete=true").timeout(pollTimeout)

Claus Ibsen 建议使用 readLock=none 获取流。 当我使用该选项时,流立即关闭,我只得到具有正确文件名的 0 字节文件。

如何配置 camel 的文件端点以使用 readLock=none 并使用文件直到完成?

单独的路由写入文件。

没有安全的方法可以知道文件何时由第 3 方写入完成。您在那里所做的是,您在文件的投票丰富中获得了 java.io.File。哪个 Camel 可以转换为 FileInputStream 来读取。但是该流无法知道第 3 方何时完成写入文件。

读取当前正在写入的文件确实是一种不好的做法。

要知道文件何时完成写入,第 3 方可能会使用一种策略来

  • 编写第二个虚拟标记文件以告知其完成
  • 写入第二个 in-progress 虚拟文件以告知当前正在写入文件并在完成后删除此文件
  • 使用临时名称写入文件并在完成后重命名
  • 将文件写入另一个文件夹,完成后移动
  • 监视文件的修改时间戳,如果时间戳在 X 周期后没有改变,则假定其已完成写入
  • 尝试重命名文件并假设如果 OS 这样做失败,则第 3 方仍在写入文件
  • 等...

JDK 文件锁 API 不能跨文件系统工作,通常不能很好地获取文件锁 - 它可能在同一个 JVM 中工作,但当它的 2 个不同时系统。