CloudBlobClient .setTimeoutInMs()不起作用

时间:2013-04-09 12:56:13

标签: android azure azure-storage-blobs

我正在设置以下值的超时值:

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);

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

3 个答案:

答案 0 :(得分:1)

我浏览了这个功能here的文档,有一件事引起了我的注意,下面是最后一个声明:

  

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

以下是我正在考虑的事情:

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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