c# - SubscriptionClient.RecieveBatch 未检索所有代理消息

标签 c# azure azureservicebus azure-servicebus-queues azure-servicebus-topics

我有一个控制台应用程序来读取 Azure 服务总线上的订阅中存在的所有代理消息。我那里有大约 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 条消息。

我认为一次可以检索的消息数量有一些限制。但是,在 RecieveBatch 方法的 msdn 页面上没有提到这样的事情。我该怎么做才能一次检索所有消息?

注意:

  1. 我只想读取消息,然后让它存在于服务总线上。因此我不使用 message.complete 方法。

  2. 我无法从服务总线中删除并重新创建主题/订阅。

编辑:

我使用 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();
    }
    }

我的订阅中有 3255 条消息。第一次调用 peekBatch 时,它会收到 250 条消息。因此它进入带有 PeekBatch(250,3225) 的 while 循环。每次只收到250条消息。我在输出列表中的最终消息总数为 3500,其中有重复项。我无法理解这是怎么发生的。

最佳答案

我已经弄清楚了。订阅客户端会记住它检索到的最后一批,并在再次调用时检索下一批。

所以代码是:

    IEnumerable<BrokeredMessage> dlIE = null;
List<BrokeredMessage> bmList = new List<BrokeredMessage>();
  long i = 0;  
  while (i < count)
  {
   dlIE = subsciptionClient.PeekBatch(Convert.ToInt32(count));
   bmList.AddRange(dlIE);
   i = i + dlIE.Count();
  }

感谢MikeWo的指导

注意:一次可以查看的消息数量似乎存在某种大小限制。我尝试使用不同的订阅,并且每个订阅获取的消息数量不同。

关于c# - SubscriptionClient.RecieveBatch 未检索所有代理消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209406/

相关文章:

c# - 微妙的 WP7 枢轴 ListViewItem 动画

c# - GZipStream - 即使刷新也不写入所有压缩数据?

azure - 创建与 Azure IoT 中心通信所需的 SAS key

c# - Visual Studio 2022 中的 Microsoft Identity Platform 依赖项配置

c# - ServiceBusTrigger 选择错误的配置文件

C# 将处理结果重定向到文本文件

c# - 创建具有固定大小数组的不安全结构时,数组是否初始化为默认值?

c# - Azure函数 "Unable to find assembly"

Azure ServiceBus Eventhub,当某些事件数据过期时, "offset"是否仍然可用/持久?

azure - 发送/传递的 Azure 服务总线主题订阅消息的日志在哪里?