【问题标题】:brokeredmessage microsoft service bus queue ReceiveBatch not obtaining all dead letter messagesbrokeredmessage microsoft 服务总线队列 ReceiveBatch 未获取所有死信消息
【发布时间】:2015-05-13 08:27:21
【问题描述】:

我正在使用 Microsoft 服务总线测试一个带有死信队列的项目。我发送了 26 条消息(代表字母表),并使用了一个程序,该程序在接收消息时将其中一些随机放入死信队列中。消息总是以偷看模式从死信队列中读取,所以一旦它们到达那里,它们就会呆在那里。运行几次后,所有 26 条消息都会在死信队列中,并一直保留在那里。

但是,在阅读它们时,有时只阅读了几个(例如 6 个),有时是全部 26 个。

我使用命令:

const int maxToRead = 200; // It seems one wants to set this higher than    
                          // the anticipated load, obtaining only some back
IEnumerable<BrokeredMessage> dlIE = 
            deadletterSubscriptionClient.ReceiveBatch(maxToRead);

ReceiveBatch 有一个过载,它有一个超时,但这无济于事,而且可能只会增加复杂性。

为什么不是每次都获取全部26条消息,因为它是在“peek”模式下使用的,消息一直在那里。

我可以使用“服务总线资源管理器”来实际验证所有消息是否都在死信队列中并保留在那里。

这主要是一个测试示例,但人们希望“ReceiveBatch”能够在确定性模式下工作,而不是以非常(糟糕)的随机方式......

【问题讨论】:

  • 另请参阅stackoverflow.com/questions/26862747/… 在提出类似问题时无法按预期工作
  • 有谁知道如何向微软报告这个错误;我试过了,但我找不到现成的链接.... –

标签: c# azure queue azure-servicebus-queues brokeredmessage


【解决方案1】:

这只是部分答案或解决方法;以下代码可靠地获取所有元素,但不使用“ReceiveBatch”;请注意,据我所知,Peek(i) 在基于 1 的索引上运行。另外:取决于在哪个服务器上运行,如果您通过消息拉取收费,这可能(或可能不会)更昂贵,因此使用风险自负:

            List<BrokeredMessage> dlIE = new List<BrokeredMessage>();

            BrokeredMessage potentialMessage = null;
            int loopCount = 1;
            while ((potentialMessage = deadletterSubscriptionClient.Peek(loopCount)) != null)
            {
                dlIE.Add(potentialMessage);
                loopCount++;
            }

【讨论】:

  • 如果有人对如何直接使用 ReceiveBatch 有更好的答案,请发帖。
  • 遗憾的是,要以更明显、更简单的方式向 Microsoft 报告看似真正的错误并不容易!
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多