在创建文件后立即将文件放入S3

时间:2017-04-26 09:31:28

标签: java multithreading amazon-s3 operating-system filesystems

我有两台具有不同Java应用程序的计算机,它们都运行在Linux上并使用通用的Windows share文件夹。一个应用程序触发另一个应用程序生成特定文件(例如image / 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自己处理它。

所以我的猜测是生成应用程序编写了一个文件并返回但实际上它仍然是由操作系统在后台编写的,这就是为什么第一个应用程序得到的文件不完整。

我真的很感激如何处理这种情况的建议。也许有办法检测操作系统当前是否正在修改该文件?

1 个答案:

答案 0 :(得分:0)

我遇到了AmazonS3Exception: The Content-MD5 you specified did not match what we received.我终于通过解决下面列表中的第一项解决了这个问题,并不是非常明显。

其他任何可能的解决方案:

  • 请确保不要在多个ObjectMetadata来电中使用相同的putObject个对象。
  • 考虑禁用ChunkedEncoding。 client.setS3ClientOptions(S3ClientOptions.builder().disableChunkedEncoding().build())
  • 确保文件在上传时未被编辑。