我正在(使用.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"))));
创作
答案 0 :(得分:0)
我只是尝试使用CloudAppendBlob.CreateOrReplace
创建附加blob,我注意到的是,这并没有返回AppendBlobCommittedBlockCount
这就是为什么这个属性值仍然存在的原因为null
(默认值)。
要填充此值,您需要再次获取blob的属性。创建blob后,请添加以下代码行,您应该在其中看到非空值:
_appendBlob.FetchAttributes();
所以你的代码是:
_appendBlob = container.GetAppendBlobReference($"{folderName}/{appendBlobReference}-{currentDate.ToString("yyyyMMddHHmm")}");
_appendBlob.CreateOrReplace();
_appendBlob.FetchAttributes();