【问题标题】:Java application needs exclusive access to file being delivered by sftpJava 应用程序需要独占访问由 sftp 传递的文件
【发布时间】:2014-09-04 11:14:17
【问题描述】:

环境:Ubuntu 12 服务器上的 Java 7。

我有一个 Java 应用程序,它轮询通过 sftp 传递的传入 .zip 文件。我无法控制传递文件的客户端。

传递的文件非常大,在某些情况下,轮询机制会在文件仍在写入时检测到该文件。在这种情况下,Java 应用程序会因为认为文件已损坏而出现故障。

检测本地sftp服务器何时完成文件写入最有效的方法是什么?

【问题讨论】:

  • 您能改写一下吗? “轮询传入的 .zip 文件”到底是什么意思?
  • 我会定期检查目录中是否出现了 ZIP 文件。然后我解压缩文件并对其中的文件进行一些处理。
  • 我知道您无法控制交付文件的客户端,但您不能要求这些人至少提供一个 MD5 哈希值,以便您在之前检查包的完整性想解压吗?

标签: java ubuntu sftp


【解决方案1】:

有很多方法可以解决这个问题。你可以选择一个,但你实现的越多越好:

  • 发件人应上传为 .tmp 文件,然后在完成后重命名为 .zip,以便观察者只能看到完成的文件。
  • watcher 应该检查文件的最后修改时间,如果在最后 10 秒(可能是 1 分钟)内被修改,则忽略该文件并稍后重试。
  • 如果您的操作系统支持,请在读取文件之前尝试获取文件的排他锁。这在 Java 中并不容易,并且取决于操作系统的具体情况。
  • 始终以 zip 文件的形式发送文件,因为如果文件不完整或损坏,它将无法通过 CRC 检查。此外,您还可以获得较小的传输、较小的存档文件夹等的额外好处。(当然,您已经在这样做,如问题中所述)。

查看骆驼的File2 组件并查看它为您提供的所有选项。让你想用 Camel,对吧?

【讨论】:

  • 如前所述,我无法控制发件人。
  • 是的,我注意到了,但希望我的回答对于这种一般情况是完整的。因为它很常见。
  • 这将是理想的解决方案,但我没有机会改变它。我正在从企业 SAP 服务器上运行的 Control-M 作业接收数据 - 改变这样的事情是一个痛苦的世界。
  • 你的第二个选择可能是我要走的路……
  • 告诉我吧!我看的地方都一样。将在我的列表中再添加一个“最佳实践”...
【解决方案2】:

查看答案:https://stackoverflow.com/a/5851185/92063,其中提到了incron。您可以使用它来通知您的应用程序发生了文件系统事件。

来自链接网站的引述:

incron :: inotify cron 系统

这个程序是一个“inotify cron”系统。它由一个守护进程和 一个表操纵器。您可以像使用常规 cron 一样使用它。 不同之处在于 inotify cron 处理文件系统事件 而不是时间段。

【讨论】:

    【解决方案3】:

    您无法控制发件人,这很不幸,因为最好的解决方案如下(之后我会给出另一个解决方案,不需要发件人更改任何内容)。

    上传完成后,发件人应重命名文件。

    例如该文件在上传期间命名为fileInProgress.txt,在上传完成时命名为fileFinished.txt。您将限制您的 java 程序只监视名称为 *Finished.txt 的文件。这是最简单且绝对可靠的解决方案。


    您的解决方案如下。

    • 从您的 java 程序中列出上传文件夹中的文件并存储文件大小。
    • 等待 10 秒(如果您想在保存端等待更长时间)。
    • 再次列出文件。
    • 所有大小未更改的文件都已完成并可以处理。

    请注意,这并不能让您绝对确定上传已完成,但文件大小检查之间的时间间隔越长,它就越接近。

    【讨论】:

      【解决方案4】:

      正如David Roussel 提到的,Camel 对此非常有用。看看File2 中的 initialDelay(以及您可能会发现有用的任何其他内容),因为这会在轮询目录之前放置一个指定的延迟。

      我所做的任何类型的文件轮询我都使用过 Camel,因为它更容易处理这些情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-28
        • 2019-01-11
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 2019-05-06
        • 2012-01-30
        相关资源
        最近更新 更多