7

C# Winforms プロジェクトで Azure Event Hubs を使用しています。

EventProcessorHost オブジェクトと EventReciever オブジェクトを作成して、イベント ハブからメッセージを取得して表示する作業を実行します。

メッセージ取得プロセスの一部には、フォームが開かれたときにイベント ハブに新しいコンシューマー グループを作成することが含まれます。(コンシューマ グループ名を新しい GUID にするだけです)。

この^すべてが機能します。

フォームが閉じられると、コンシューマー グループはイベント ハブから削除されます。これは、ポータルを通じてイベント ハブを表示することによって検証されます。

ただし、イベント ハブの作業を行うためにコンシューマー グループによって使用されるパーティション オブジェクトは、まだストレージ アカウントに存在します。

CloudBerry エクスプローラーを使用すると、次のように表示されます。

ここに画像の説明を入力

各 GUID はコンシューマー グループです。私の開発の最後の数か月でここには数百ありますが、イベント ハブには一度に 20 のアクティブなコンシューマー グループしか含めることができません。

各コンシューマー グループ フォルダー内には、そのコンシューマー グループが使用する 4 つのパーティションのそれぞれに関する情報を含む 4 つのファイルがあります。

これらを自動的にクリーンアップできるイベント ハブ オブジェクト (EventReceiver、EventProcessorHost など) の API 呼び出しはありますか? 調べましたが、何も見つかりませんでした。現在、Event Hubs に関するドキュメントは最小限です。

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 に答える