7

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

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

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

所有这些^都有效。

当表单关闭时,消费者组将从事件中心中删除,并通过门户查看事件中心来验证这一点。

但是,消费者组用于执行事件中心工作的分区对象仍然存在于存储帐户中。

通过 CloudBerry 资源管理器时,我看到:

在此处输入图像描述

其中每个 GUID 都是一个消费者组。在我开发的最后几个月里,这里有数百个,但一个事件中心一次只能包含 20 个活跃的消费者组。

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

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

我查看了 EventProcessorHost.PartitionManagerOptions.SkipBlobContainerCreation = true 但这没有帮助。

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

谢谢!

4

2 回答 2

2

我最终得到了这个工作。

这实际上只是从存储帐户中删除 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();
                }
            }

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

希望这可以帮助某人

于 2015-12-17T22:41:02.227 回答
0

我可能误解了你,或者你在写这个问题的时候做不到,但至少在今天,你不能只使用 EventProcessorHost 而不设置检查点吗?

这样,将不会在存储帐户中创建任何 blob,并且您无需清理任何内容。这是一个小例子

于 2018-01-17T19:47:10.420 回答