我有一個控制檯應用程序來讀取Azure服務總線上預訂中存在的所有代理消息。我在那裏有大約3500條消息。這是我讀取消息的代碼:SubscriptionClient.RecieveBatch不檢索所有代理消息
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
方法。我無法從服務總線中刪除並重新創建主題/訂閱。
編輯:
我用PeekBatch代替ReceiveBatch這樣的:
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();
}
}
我在訂閱消息。當第一次調用peekBatch時,它會獲得250條消息。所以它進入了帶有PeekBatch(250,3225)
的while循環。每次只收到250條消息。我在輸出列表中輸入的最終消息總數爲,包含重複項。我無法理解這是如何發生的。
我在我的回答中提到過。 「通過在PeekBatch下面使用相同的SubscriptionClient,最後拉取的序列號會保留,因爲在循環時它應該保持跟蹤並穿過整個隊列。」 – MikeWo
@MikeWo對不起,我沒有在這裏看到你的答案,但在SO中的其他問題。實際上,在我看到你的答案之前,我正在根據你的答案在其他地方使用peekbatch。 – nitinvertigo
@MikeWo PeekBatch檢索的郵件數量是否有限制?它適用於3200,但是當訂閱上有5000條消息時,它會顯示此錯誤:內部服務器錯誤:服務器沒有提供有意義的答覆;這可能是由於會話過早關閉造成的。 – nitinvertigo