Azure Service Bus ReceiveBatch()的奇怪行为

B-S*_*art 10 c# azure azureservicebus

目前使用Azure Service Bus主题并遇到使用ReceiveBatch方法接收我的消息的问题.问题是预期的结果实际上并不是我得到的结果.这是基本的代码设置,用例如下:

    SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString, convoTopic, subName);

    IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100);
        foreach (BrokeredMessage message in messageList)
        {
            try
            {
                Console.WriteLine(message.GetBody<string>() + message.MessageId);

                message.Complete();
            }
            catch (Exception ex)
            {
                message.Abandon();
            }
        }

    client.Close();
    MessageBox.Show("Done");
Run Code Online (Sandbox Code Playgroud)
  1. 使用上面的代码,如果我发送4条消息,那么在第一次运行时轮询我得到第一条消息.在第二轮比赛中,我得到了另外一部分.我期待在同一时间获得全部4分.它似乎总是在第一次民意调查中返回一个单数值,然后在随后的民意调查中返回其余值.(与3和5的结果相同,我在第二次尝试时发送n个消息中的n-1个,第一次尝试时发送1条消息).

  2. 如果我有0条消息要接收,则操作需要大约30-60秒才能获得messageList(具有0计数).我需要它立即返回.

  3. 如果我将代码更改为IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100, new Timespan(0,0,0));然后问题#2消失,因为问题1仍然存在,我必须两次调用代码以获取所有消息.

我假设问题#2是由于我在#3中覆盖的默认超时值(尽管我发现如果有消息,它会立即响应而不等待默认时间,这令人困惑).我不知道为什么我从未在单个ReceiveBatch中收到全部消息.

B-S*_*art 9

我让ReceiveBatch()正常工作的方式是做两件事.

  1. 禁用主题中的分区(我必须为此创建一个新主题,因为您无法在创建后切换它)
  2. 在每个创建的订阅上启用批处理,如下所示:
  3. 项目清单

SubscriptionDescription sd = new SubscriptionDescription(topicName, orgSubName); sd.EnableBatchedOperations = true;

在我完成这两件事后,我能够按照预期使用主题 IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100, new TimeSpan(0,0,0));