Azure Service Bus のサブスクリプションに存在するすべての仲介メッセージを読み取るためのコンソール アプリケーションがあります。そこには約3500のメッセージがあります。これはメッセージを読むための私のコードです:
SubscriptionClient client = messagingFactory.CreateSubscriptionClient(topic, subscription);
long count = namespaceManager.GetSubscription(topic, subscription).MessageCountDetails.ActiveMessageCount;
Console.WriteLine("Total messages to process : {0}", count.ToString()); //Here the number is showing correctly
IEnumerable<BrokeredMessage> dlIE = null;
dlIE = client.ReceiveBatch(Convert.ToInt32(count));
コードを実行すると、dlIE で 256 個のメッセージしか表示されません。私もこのようにプリフェッチ カウントを指定しようとしましclient.PrefetchCount
たが、256 メッセージしか返されません。
一度に取得できるメッセージの数には制限があると思いますが、メソッドのmsdnページにはそのようなことは記載されていませんRecieveBatch
。一度にすべてのメッセージを取得するにはどうすればよいですか?
ノート:
私はメッセージを読んで、サービスバスに存在させたいだけです。
message.complete
したがって、メソッドは使用しません。Service Bus からトピック/サブスクリプションを削除して再作成できません。
編集:
次のように、ReceiveBatch の代わりに PeekBatch を使用しました。
IEnumerable<BrokeredMessage> dlIE = null;
List<BrokeredMessage> bmList = new List<BrokeredMessage>();
long i = 0;
dlIE = subsciptionClient.PeekBatch(Convert.ToInt32(count)); // count is the total number of messages in the subscription.
bmList.AddRange(dlIE);
i = dlIE.Count();
if(i < count)
{
while(i < count)
{
IEnumerable<BrokeredMessage> dlTemp = null;
dlTemp = subsciptionClient.PeekBatch(i, Convert.ToInt32(count));
bmList.AddRange(dlTemp);
i = i + dlTemp.Count();
}
}
サブスクリプションに 3255 件のメッセージがあります。初めて peekBatch が呼び出されたとき、250 のメッセージを受け取ります。で while ループに入りPeekBatch(250,3225)
ます。毎回 250 件のメッセージしか受信されません。出力リストにある最終的な合計メッセージは、重複を含む3500です。これがどのように起こっているのか理解できません。