Azure AppendBlob的属性AppendBlobCommittedBlockCount将变为null

时间:2016-10-27 21:00:15

标签: c# azure azure-blob-storage

我正在(使用.NET)写入一个天蓝色的AppendBlob,如果我已经达到允许添加的最大块数,我想在向它添加任何内容之前进行检查。 I have read该限制为50k,因此我将使用该数字。为此,我正在尝试这个

public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (var message in messages)
    {
        try
        {
            if (_appendBlob.Properties.AppendBlobCommittedBlockCount == _maximumBlockNumberPerBlob)
            {
                CreateBlob(null);
            }
            ProcessMessage(message);
        }
        catch (Exception ex)
        {
            _log.Error("Failed Processing Message", ex);
        }
    }

    await context.CheckpointAsync();
}

但是AppendBlobCommittedBlockCount总是为null,而CreateBlob方法只是创建一个新的blob(因为我使用Timer class来调用它所以它需要那个可疑的null参数)。任何想法为什么会发生这种情况,或者如果不是这样的话我怎么检查呢?

由于

更新:

CreateBlob方法如下:

public void CreateBlob(object _)
{
    var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccount"));
    var appendBlobReference = CloudConfigurationManager.GetSetting("appendBlobReference");
    var blobClient = storageAccount.CreateCloudBlobClient();
    var currentDate = DateTime.UtcNow;
    var container = blobClient.GetContainerReferenc("testContainer");
    container.CreateIfNotExists();
    _appendBlob = container.GetAppendBlobReference($"{folderName}/{appendBlobReference}-{currentDate.ToString("yyyyMMddHHmm")}");
    _appendBlob.CreateOrReplace();
}

将_appendBlob设为私有字段和folderName,将appendBlobReference设为字符串

所有这些方法都在一个实现IEventProcessor的类中,因为它是从EventHubs中获取事件的,所以基本上当流中有新的东西时会调用Task ProcessEvenstAsync。

同样,我第一次调用CreateBlob是在那个使用计时器实现IEventProcessor的类的构造函数内部(因为我将每15分钟独立创建一个新的,如果它已满或没有)。这个位工作

_timer = new Timer(CreateBlob, null, TimeSpan.FromMilliseconds(0), TimeSpan.FromMinutes(int.Parse(CloudConfigurationManager.GetSetting("updateBlobNameIntervalInMinutes"))));

创作

1 个答案:

答案 0 :(得分:0)

我只是尝试使用CloudAppendBlob.CreateOrReplace创建附加blob,我注意到的是,这并没有返回AppendBlobCommittedBlockCount这就是为什么这个属性值仍然存在的原因为null(默认值)。

要填充此值,您需要再次获取blob的属性。创建blob后,请添加以下代码行,您应该在其中看到非空值:

        _appendBlob.FetchAttributes();

所以你的代码是:

_appendBlob = container.GetAppendBlobReference($"{folderName}/{appendBlobReference}-{currentDate.ToString("yyyyMMddHHmm")}");
    _appendBlob.CreateOrReplace();
    _appendBlob.FetchAttributes();