我在C#Winforms项目中使用Azure事件中心。

我创建EventProcessorHost和EventReciever对象来执行从事件中心检索消息并显示它们的工作。

我的消息检索过程的一部分涉及到在打开表单时在事件中心上创建一个新的使用者组。 (我只是将使用者组命名为新的GUID)。

所有这些^作品。

关闭表单后,将从“事件中心”中删除使用者组,这可以通过通过门户查看“事件中心”来验证。

但是,使用者组用于完成事件中心工作的分区对象仍存在于存储帐户中

通过CloudBerry资源管理器时,我看到以下内容:

azure - 如何通过代码从Azure Blob存储中删除事件中心分区?-LMLPHP

每个GUID是一个消费者组。在我开发的最后几个月中,这里有成百上千的用户,但是事件中心一次只能包含20个活跃的消费者群体。

每个使用者组文件夹内有4个文件,其中包含有关该使用者组所使用的4个分区中的每个分区的信息。

是否可以对Event Hub对象(EventReceiver,EventProcessorHost等)进行API调用,从而可以自动为我清除这些对象?我看过但没有找到任何东西,有关事件中心的文档目前很少。

我看着EventProcessorHost.PartitionManagerOptions.SkipBlobContainerCreation = true,但这没有帮助。

如果不是,是否需要设置存储帐户上的设置以避免这种垃圾堆积?

谢谢!

最佳答案

我最终得到了这个工作。

这实际上只是从存储帐户中删除Blob,但略有改动。

首先,在创建IEventProcessor对象时,您需要存储其租约信息:

    Task IEventProcessor.OpenAsync(PartitionContext context)
        {
        Singleton.Instance.AddLease(context.Lease);
        Singleton.Instance.ShowUIRunning();
        return Task.FromResult<object>(null);
        }

我创建的“单例”只是一个单例对象,多个线程可以转储其信息。 Singleton的“添加租约”实现:
    public void AddLease(Lease l)
        {
        if (!PartitionIdToLease.ContainsKey(l.PartitionId))
            {
            PartitionIdToLease.Add(l.PartitionId, l.Token);
            }
        else
            PartitionIdToLease[l.PartitionId] = l.Token;
        }

其中“PartitionIdToLease”是一个
Dictionary<string, string>

现在,删除代码:
CloudStorageAccount acc = CloudStorageAccount.Parse("Your Storage Account Connection String");
CloudBlobClient client = acc.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("Name of Event Hub");
CloudBlobDirectory directory = container.GetDirectoryReference("Name of Folder");


foreach (IListBlobItem item in directory.ListBlobs())
            {
            if (item is CloudBlockBlob)
                {
                CloudBlockBlob cb = item as CloudBlockBlob;
                AccessCondition ac = new AccessCondition();
                string partitionNumber = cb.Name.Substring(cb.Name.IndexOf('/') + 1); //We want the name of the file only, and cb.Name gives us "Folder/Name"

                ac.LeaseId = Singleton.Instance.PartitionIdToLease[partitionNumber];

                cb.ReleaseLease(ac);
                cb.DeleteIfExists();
                }
            }

因此,现在每次我的应用程序关闭时,它都负责删除它在存储帐户中生成的垃圾。

希望这对某人有帮助

关于azure - 如何通过代码从Azure Blob存储中删除事件中心分区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34007391/

10-12 23:42