我正在设置以下值的超时值:
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。没时间了
答案 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。你的重试政策是什么?一定要关闭它。