如何在ServiceBus上使用sequenceNumber的MessageReceiver.Receive方法

chu*_*lee 5 .net c# servicebus azure

我正在尝试从deadletter队列中重新提交一条消息.

我可以在死信队列上重播一条消息,没关系.问题是我现在想要从deadletter队列中删除它.

这是我想要做的:

var subscription = "mySubscription";
var topic = "myTopic";

var connectionString = "connectionStringOnAzure";
var messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString);

var messageReceiver = messagingFactory.CreateMessageReceiver(SubscriptionClient.FormatDeadLetterPath(topic, subscription), ReceiveMode.ReceiveAndDelete);


long messageSequenceNumber = 835;
var brokeredMessage = messageReceiver.Receive(messageSequenceNumber);  // this part fails

// mark message as complete to remove from the queue
brokeredMessage.Complete();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

 Microsoft.ServiceBus.Messaging.MessageNotFoundException : Failed to lock one or more specified messages. The message does not exist..TrackingId:ae15edcc-06ac-4d2b-9059-009599cf5c4e_G5_B15,TimeStamp:8/13/2013 1:45:42 PM
Run Code Online (Sandbox Code Playgroud)

但是,不是指定消息序列号而是我只使用如下所示的ReceiveBatch,它没问题.

// this works and does not throw any errors
var brokeredMessages = messageReceiver.ReceiveBatch(10);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?或者是否有另一种方法来重新处理动物并移除它们?

Cle*_*ers 2

死信队列像任何其他队列一样按顺序处理。

Receive(seqNo) 方法与 Defer() 结合使用,后者将消息放入不同的辅助队列 - “延迟队列”。延迟队列适用于您以不符合预期顺序(例如在状态机中)获取消息并且需要一个位置来放置提前到达的消息的情况。您可以使用 Defer() 停放这些消息并记下该消息(甚至可能在会话状态下),然后在准备好后提取消息。例如,SharePoint 使用的 Workflow Manager 运行时就使用该功能。

  • 感谢您的回答。不幸的是,我需要从死信队列中挑选出某些消息,以便将它们标记为完整,以便它们不再出现在那里。我想这是不可能的。也许我应该使用消息的延迟模式...... (2认同)