Azure Service Bus - 删除特定消息

时间:2014-11-20 16:27:07

标签: c# azure azureservicebus

我正在开发一个系统,它将大量数据同步分解为小任务。我将每个小任务添加为Azure Service Bus队列中的作业/消息。

我有X个工作者角色,然后检查队列并处理数据。

我不希望队列中有很多消息,因为目的是处理消息,完成消息,然后再次重新添加相同的消息,但安排在X分钟时间。这将给我一个循环来继续处理这些任务。

Azure功能的优点在于它们可以为您处理所有服务器端的内容,但缺点是有时很难调试或操作数据。

我希望能够做的是在Web界面中显示队列中的消息列表(我使用PeekBatch完成)。然后,我希望能够选择部分/全部消息并将其删除。

如果代码中存在错误,我可能想要这样做,我想停止某种类型的消息停止。

继续之后,我也有从网页重新添加消息的功能。也许我可能想要提高我的工作角色和消息以更快的速度执行任务(或减慢它们的速度),或者重新添加我删除的消息。

所以,问题是,如何从队列中实际选择特定的消息然后将其删除?从我所看到的,没有明显的方法可以做到这一点,如果可能的话,它将需要某种解决方法。这对我来说听起来有点奇怪。

编辑:

我有一些有用的东西,但它似乎并不是一个很好的解决方案:

    public void DeleteMessages(List<long> messageIds)
    {
        foreach (var msg in Client.ReceiveBatch(100))
        {
            if (messageIds.Contains(msg.SequenceNumber))
                msg.Complete(); // Deletes the message
            else
                msg.Abandon(); // Puts it back in the queue
        }
    }

队列越大,效率越低越好,但至少会在删除调用的同时停止所有活动并删除指定的消息。

它也只会删除准备处理的邮件。将来的消息将被忽略,因此我目前添加了添加&#34; Sleep&#34;消息,停止处理队列,直到我的消息准备好&#34;我可以删除它们。

Microsoft已通知我们,他们目前正在使用API​​删除应在几个月内提供的特定消息。在那之前,它完全是关于解决方法。

六月更新:

仍然在此问题上没有Microsoft的更新,上述方法不太理想。我现在修改了我的代码,以便:

我在邮件中添加的对象有一个新属性:

Guid? MessageId { get; set; }

注意它是可以为空的Guid只是为了向后兼容

当我想删除邮件时,我将MessageId添加到数据库表中&#34; DeletedMessage&#34;。

在处理消息时,我在DeletedMessage表中查找匹配的Guid,如果找到了,我只需完成()消息而不进行正常处理。

这很好用,但是开销很小。如果你没有处理大量的消息,这不是一个大问题。

另请注意,我最初使用SequenceNumber执行此操作,但(奇怪的是)SequenceNumber在查看和检索邮件之间发生了变化!这可以防止这个想法起作用,除非您使用上面的ID。

2 个答案:

答案 0 :(得分:0)

您可以创建自己的队列清理程序,该程序具有一个消息监听器,可以根据消息的某些条件查看并放弃或提交消息。如果您预见到需要在实际生产环境中进行清理,它可能是控制器中的一个动作。

答案 1 :(得分:0)

从我的实验中,无法从邮件队列中删除Active消息。

可以通过调用Receive(sequenceNumber)然后调用Complete()来删除延期消息。

可以通过致电CancelScheduledMessageAsync(sequenceNumber)删除预定消息。

对于有效消息,您必须确保它们在某些时候被移动到死信队列。

以后可以删除或重新提交死信队列中的消息。