brokeredmessage 微软服务总线队列 ReceiveBatch 未获取所有死信消息
brokeredmessage microsoft service bus queue ReceiveBatch not obtaining all dead letter messages
我正在使用 Microsoft 服务总线测试一个带有死信队列的项目。我发送了 26 条消息(代表字母表),我使用一个程序在接收消息时随机将其中一些消息放入死信队列中。消息始终以 peek 模式从死信队列中读取,因此一旦它们到达那里,它们就会留在那里。 运行几次后,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"模式下使用的,并且消息留在那里。
我可以使用 "Service Bus Explorer" 实际验证所有消息都在死信队列中并保留在那里。
这主要是一个测试示例,但人们希望 "ReceiveBatch" 能够在确定性模式下工作,而不是以非常(糟糕的)随机方式工作...
这只是部分答案或解决方法;以下代码可靠地获取所有元素,但不使用 "ReceiveBatch";请注意,据我所知,Peek(i) 在基于一个的索引上运行。另外:根据 运行 在哪个服务器上,如果您通过消息拉取收费,这可能(或可能不会)更贵,所以使用风险自负:
List<BrokeredMessage> dlIE = new List<BrokeredMessage>();
BrokeredMessage potentialMessage = null;
int loopCount = 1;
while ((potentialMessage = deadletterSubscriptionClient.Peek(loopCount)) != null)
{
dlIE.Add(potentialMessage);
loopCount++;
}
我正在使用 Microsoft 服务总线测试一个带有死信队列的项目。我发送了 26 条消息(代表字母表),我使用一个程序在接收消息时随机将其中一些消息放入死信队列中。消息始终以 peek 模式从死信队列中读取,因此一旦它们到达那里,它们就会留在那里。 运行几次后,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"模式下使用的,并且消息留在那里。
我可以使用 "Service Bus Explorer" 实际验证所有消息都在死信队列中并保留在那里。
这主要是一个测试示例,但人们希望 "ReceiveBatch" 能够在确定性模式下工作,而不是以非常(糟糕的)随机方式工作...
这只是部分答案或解决方法;以下代码可靠地获取所有元素,但不使用 "ReceiveBatch";请注意,据我所知,Peek(i) 在基于一个的索引上运行。另外:根据 运行 在哪个服务器上,如果您通过消息拉取收费,这可能(或可能不会)更贵,所以使用风险自负:
List<BrokeredMessage> dlIE = new List<BrokeredMessage>();
BrokeredMessage potentialMessage = null;
int loopCount = 1;
while ((potentialMessage = deadletterSubscriptionClient.Peek(loopCount)) != null)
{
dlIE.Add(potentialMessage);
loopCount++;
}