У меня есть консольное приложение для чтения всех брокерских сообщений, присутствующих в подписке на Azure Service Bus. У меня там около 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
.Я не могу удалить и воссоздать тему/подписку с Service Bus.
Edit:
Я использовал 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 сообщений. поэтому он переходит в цикл while с PeekBatch(250,3225)
. Каждый раз, когда принимается только 250 сообщений. Окончательные итоговые сообщения, которые я получаю в выходном списке, - с дубликатами. Я не могу понять, как это происходит.
Я упомянул об этом в своем ответе. «Используя тот же SubscriptionClient с PeekBatch под капотом, последний выведенный порядковый номер хранится так же, как и вы прокручиваете его, он должен отслеживать и проходить через всю очередь». – MikeWo
@MikeПростите, что я не читал ваш ответ здесь, но для какого-то другого вопроса в SO. Фактически, прежде чем я увидел ваш ответ здесь, я работал с peekbatch на основе вашего ответа где-то в другом месте. – nitinvertigo
@MikeWo Существует ли ограничение на количество сообщений, полученных PeekBatch? Он отлично работает для 3200, но когда в подписке есть 5000 сообщений, он показывает эту ошибку: Внутренняя ошибка сервера: сервер не дал значимого ответа; это может быть вызвано преждевременным отключением сеанса. – nitinvertigo