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

c# .net azure servicebus

3737 观看

2回复

78 作者的声誉

我正在尝试从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();

我收到以下错误消息:

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

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

作者: chuen hing lee 的来源 发布者: 2013 年 8 月 13 日

回应 (2)


1

2395 作者的声誉

决定

deadletter队列按顺序处理,就像任何其他队列一样。

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

作者: Clemens Vasters 发布者: 14.08.2013 06:25

0

422 作者的声誉

创建接收器后,您可以礼貌地开始接收所有消息(不挑剔:-),直到您遇到带有SequenceNumber的消息,在消息上调用Complete()并结束迭代队列。即

var message = messageReceiver.Receive();

if (message.SequenceNumber == 835)
    message.Complete();

如果没有完成消息,它将保留在队列中,这就是您想要的。

作者: Mariusz 发布者: 28.02.2019 03:22
32x32