当前正在使用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");
  • 使用上面的代码,如果我发送4条消息,则在第一次运行时进行轮询,得到第一条消息。在第二次运行中,我得到了其他3个。我希望同时获得所有4个。它似乎总是在第一个民意测验中返回一个奇异值,然后在随后的民意测验中返回其他值。 (与3和5的结果相同,在第二次尝试中我收到n-1个消息,而在第一次尝试中我收到了1条消息)。
  • 如果我有0条消息要接收,则该操作大约需要30-60秒才能获得messageList(计数为0)。我需要立即返回。
  • 如果我将代码更改为IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100, new Timespan(0,0,0));,则问题2消失了,因为问题1仍然存在,我必须两次调用代码才能获取所有消息。

  • 我假设问题#2是由于默认超时值导致的,而我在#3中将其覆盖(尽管我发现这令人困惑,如果有一条消息,它会立即响应而无需等待默认时间)。我不确定为什么我永远不会在单个ReceiveBatch中收到全部消息。

    最佳答案

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

  • 在主题中禁用分区(我不得不为此创建一个新主题,因为创建后您无法切换该主题)
  • 对这样创建的每个订阅启用批处理:
  • 列表项
  • SubscriptionDescription sd = new SubscriptionDescription(topicName, orgSubName);sd.EnableBatchedOperations = true;
    完成这两件事后,我可以使用IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(100, new TimeSpan(0,0,0));使主题按预期工作

    关于c# - Azure Service Bus ReceiveBatch()的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31949698/

    10-12 00:04