我在监测和固定的消息编写功能dead letter queue
的topic subscription
在Azure上.
我可以得到一个_subscriptionClient.PeekBatch(10)
用于显示的消息列表; 但是,当我们想要实际删除其中一条消息时,我们会陷入困境.
工作流程将是:
获取所有邮件的列表
将特定消息(例如集合中的第5个)发送回原始队列以进行重新处理
将关联的死信消息标记为.Complete()
.
问题是,虽然我们有消息列表,但我们不能先.Complete()
使用特定的消息.subscriptionClient.Receive()
.
由于你不能通过.Receive()
MessageId发送消息,这是否意味着我们必须逐个遍历消息,如下所示?
public BrokeredMessage GetMessageById(string messageIdentifier) { BrokeredMessage matchingMessage = null; var messageNotFound = true; var messagesToAbandon = new List(); while (messageNotFound) { var message = _subscriptionClient.Receive(); if (message == null) { throw new Exception("Could not find the message on the queue"); } if (message.MessageId == messageIdentifier) { messageNotFound = false; matchingMessage = message; } else { messagesToAbandon.Add(message); } } // Unlock all messages that do not match the matching one received. foreach (var message in messagesToAbandon) { message.Abandon(); } return matchingMessage; }
我对这种方法的问题是:
它不可扩展; 如果消息是集合中的第100个怎么办?我们必须循环到99并将每个标记为废弃
matchingMessage
如果有太多物品需要放弃,我们就有可能失去锁定
这是一个漫长的过程
如果在循环中不匹配,我已经玩弄了将每条消息标记为已放弃的想法; 然而,这会产生我们无限循环遍历相同项目的风险(.Abandon()
将它们放回队列中).
有没有人找到一个有效的方法?也许用.Defer()
用.Receive(sequenceNumber)
?