c# - 如何在ServiceBus上通过sequenceNumber使用MessageReceiver.Receive方法

标签 c# .net azure servicebus

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

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

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

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

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

最佳答案

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

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

关于c# - 如何在ServiceBus上通过sequenceNumber使用MessageReceiver.Receive方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18211179/

相关文章:

.net - .Net Windows 服务的相对路径问题..?

java - 适用于 java 的 azure 管理 sdk 示例

c# - 是否必须在请求之间处理 HttpClient 和 HttpClientHandler?

c# - 大量使用 Watin,IE 保持打开问题

c# - aspose excel GetCellIndex 索引超出空单元格的范围

c# - 如何深度复制强类型集合的成员

c# - 为什么一行错误而另一行没有错误?

c# - 一种抽象子流程成功/失败的方法

azure - 如何将Azure机器学习服务结果导出到Azure SQL DW?

javascript - 使用 $(function() { ... } 库的 HTML5 拖动事件