Java应用程序需要独占访问sftp交付的文件

Java应用程序需要独占访问sftp交付的文件,java,ubuntu,sftp,Java,Ubuntu,Sftp,环境:Ubuntu12服务器上的Java7 我有一个Java应用程序,它轮询通过sftp传递的传入.zip文件。我无法控制交付文件的客户 交付的文件相当大,在某些情况下,轮询机制会在文件仍在写入时检测到文件。在这种情况下,Java应用程序会崩溃,因为它认为文件已损坏 检测本地sftp服务器何时完成文件写入的最有效方法是什么?有多种方法可以处理此问题。您可以选择一个,但实施得越多越好: 发送者应该上传一个.tmp文件,然后在上传完成后重命名为.zip,以便观察者只看到完成的文件。 观察者应该检查文

环境:Ubuntu12服务器上的Java7

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

交付的文件相当大,在某些情况下,轮询机制会在文件仍在写入时检测到文件。在这种情况下,Java应用程序会崩溃,因为它认为文件已损坏


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

有多种方法可以处理此问题。您可以选择一个,但实施得越多越好:

发送者应该上传一个.tmp文件,然后在上传完成后重命名为.zip,以便观察者只看到完成的文件。 观察者应该检查文件的上次修改时间,如果在最后10秒内修改,可能需要1分钟,则忽略该文件,稍后再试。 如果您的操作系统支持它,请在读取文件之前尝试获取文件的独占锁。这在java中并不容易,取决于操作系统的具体情况。 始终以zip文件的形式发送文件,因为如果文件不完整或已损坏,则CRC检查将失败。此外,您还可以通过较小的传输、较小的存档文件夹等获得额外的好处。当然,正如问题中提到的,您已经在这样做了。 看看camel的组件,看看它提供给您的所有选项。让你想用骆驼,对吗?

见答案:哪个提到。您可以使用它来通知应用程序发生了文件系统事件

链接网站的引用:

incron::inotify cron系统

该程序是一个inotify cron系统。它由一个守护进程和 操纵桌子的人。您可以使用与常规cron类似的方法。 区别在于inotify cron处理文件系统事件 而不是时间段


你无法控制发送者,这是不幸的,因为最好的解决方案是下面的我会在之后给出另一个解决方案,它不需要发送者改变任何东西

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

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

您的解决方案如下

从java程序中,在上载文件夹中列出一个文件列表,并存储文件大小。 如果要保存,请等待10秒或更长时间。 再次执行文件列表。 所有大小未更改的文件都已完成并可以处理。 请注意,这并不能给您上传完成的绝对保证,但文件大小检查间隔越长,上传越近。

如前所述,Camel将非常有用。查看initialDelay以及其他一些您可能会发现很有用的方法,因为这将在轮询目录之前放置指定的延迟


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

请您重新措辞好吗?您所说的轮询传入的.zip文件的确切含义是什么?我定期检查zip文件是否出现在目录中。然后我解压文件并对其中的文件进行一些处理。我知道您无法控制发送文件的客户端,但您不能要求这些人至少提供一个MD5哈希,以便您在尝试解压之前检查包的完整性吗?如上所述,我无法控制发件人。是的,我注意到,但我希望我的回答能完整地反映这一总体情况。因为这是一个普通的解决方案。这将是一个理想的解决方案,但我没有机会改变它。我从一个运行在企业SAP服务器上的Control-m作业中接收数据,如果要更改任何类似的内容,那将是一个痛苦的世界。你的第二个选择可能是我的选择……告诉我吧!无论我在哪里看都是一样的。将在我的列表中再添加一个“最佳实践”。。。