【发布时间】:2017-09-23 14:57:58
【问题描述】:
我有两台具有不同 Java 应用程序的机器,它们都在 Linux 上运行并使用一个通用的 Windows share 文件夹。一个应用程序正在触发另一个应用程序以生成特定文件(例如图像/pdf)。然后第一个应用程序尝试将生成的文件上传到 S3。问题是我有时会这样:
com.amazonaws.services.s3.model.AmazonS3Exception: The Content-MD5 you specified did not match what we received.
或者这个:
com.amazonaws.AmazonClientException: Data read has a different length than the expected: dataLength=247898; expectedLength=262062; includeSkipped=false; in.getClass()=class com.amazonaws.internal.ResettableInputStream; markedSupported=true; marked=0; resetSinceLastMarked=false; markCount=1; resetCount=0
所有进程都是同步发生的,一个接一个(我还检查了显示没有并发活动的日志)。另外我不是自己设置 md5 哈希或内容长度,aws-sdk 自己处理它。
所以我的猜测是生成应用程序已经写入了一个文件并返回,但实际上它仍在由操作系统在后台写入,这就是第一个应用程序获取不完整文件的原因。
我非常感谢有关如何处理此类情况的建议。也许有一种方法可以检测文件当前是否未被操作系统修改?
【问题讨论】:
-
也许有一种方法可以检测文件当前是否未被操作系统修改? 不,没有这种可靠的方法 - 无论您被告知什么。因为你检查后总是可以修改文件。 所以我的猜测是生成应用程序已经编写了一个文件并返回了也许,也许不是。 Java 代码是否在主动强制写入数据以完成、刷新到磁盘并关闭文件?或者它只是让任何对象超出范围并等待它被垃圾收集并隐含刷新到磁盘并关闭文件?
-
@AndrewHenle 好吧,我很确定所有的流都被正确关闭了......
标签: java multithreading amazon-s3 operating-system filesystems