0

我正在尝试设置超时值:

CloudBlobClient cloudBlobClientUserData = cloudClientAccountUserData.createCloudBlobClient();
cloudBlobClientUserData.setTimeoutInMs(60000); //1 Minute 

CloudBlobContainer container = cloudBlobClientUserData.getContainerReference(containerName);
CloudBlockBlob blob = container.getBlockBlobReference(blobName);

inputStream = new ByteArrayInputStream(data);
blob.upload(inputStream, data.length);

有时,当互联网连接较弱blob.upload(....)时,1 分钟后不会超时。需要10多分钟。

知道为什么会这样吗?

PS:我什至尝试了 1 毫秒,例如:

cloudBlobClientUserData.setTimeoutInMs(1);

但仍然每个 blob 都在 Azure 云上上传。没有时间

4

3 回答 3

1

我在这里浏览了此功能的文档,引起我注意的一件事是下面的最后一条语句:

服务器超时间隔从服务接收到完整请求时开始,服务器开始处理响应。如果在响应返回给客户端之前超时时间已过,则操作超时。如果请求被重试,超时间隔会在每次重试时重置

这就是我在想正在发生的事情:

我假设您没有明确设置重试策略,因此存储客户端库使用默认重试策略(即指数重试策略)。因此,您的第一个请求超时并重试请求,但是当重试请求时,超时间隔将重置为其默认值,即 90 秒。您是否可以通过显式设置重试策略来尝试No Retry不重试请求,并根据您在代码中指定的时间间隔查看您的请求是否超时。

于 2013-04-09T14:46:45.160 回答
0

超时设置适用于单个存储服务操作。我不确定你的 blob 有多大,但我怀疑它是以更小的块上传的。上传的每个块都会受到超时的影响。因此,虽然整个上传可能需要几分钟,但每个块都在超时期限内完成。

另一种可能性是发生了重试。如果有重试,则重置超时。因此,可能会发生一些间歇性故障,这些故障在重试尝试中得到解决。

您可以使用 Fiddler 来验证所有这些以跟踪上传。例如,在跟踪中查找这样的行:

输入 https://.blob.core.windows.net/test/?comp=block&blockid=MkZGREU3RkItMDAwMDE1&timeout=90 HTTP/1。

于 2013-04-09T14:44:11.817 回答
0

我对 Android 的东西不是很熟悉,但你能追踪请求吗?您应该在线上看到 REST 调用,并且如果它被设置,它将有一个 '&timeout=xxx' 参数。通常这是每个块而不是每个 blob。您的重试策略是什么?确保你也关闭它。

于 2013-04-09T14:47:29.703 回答