5

我正在尝试从死信队列重新提交消息。

我可以在死信队列上重播消息,这很好。问题是我现在想从死信队列中删除它。

这是我正在尝试做的事情:

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();

我收到以下错误消息:

 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

但是,我没有指定消息序列号,而是使用如下所示的 ReceiveBatch,这很好。

// this works and does not throw any errors
var brokeredMessages = messageReceiver.ReceiveBatch(10);

我错过了什么吗?还是有另一种重新处理死信并将其删除的方法?

4

2 回答 2

2

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

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

于 2013-08-14T06:25:56.433 回答
1

创建接收者后,您可以礼貌地开始接收所有消息(不要挑剔),直到遇到带有您的 SequenceNumber 的消息,在消息上调用 Complete() 并停止迭代队列。IE

        while (true)
        {
            BrokeredMessage message = receiver.Receive();
            if (message.SequenceNumber == sequenceNumber)
            {
                message.Complete();
                break;
            }
        }

如果没有完成消息,它会保留在队列中,这就是您想要的(至少在 .NET 4.5 中。值得注意的是,如果找不到您的序列号,Receiver 将无限期地循环队列。

于 2019-02-28T15:22:22.633 回答