C# Azure服务总线-删除特定消息

C# Azure服务总线-删除特定消息,c#,azure,azureservicebus,C#,Azure,Azureservicebus,我正在开发一个系统,它将涉及大量的数据同步,并分解成小任务。我将每个小任务添加为Azure服务总线队列上的作业/消息 我有X个工作者角色,然后检查队列并处理数据 我不希望队列中有很多消息,因为其目的是处理一条消息,完成它,然后再次重新添加同一条消息,但计划时间为X分钟。这将给我一个循环来继续处理这些任务 Azure功能的好处在于,它们可以为您处理所有服务器端的事情,但缺点是有时很难调试或操作数据 我希望能够在web界面中显示队列中的消息列表(我使用PeekBatch完成了此操作)。然后,我希望能

我正在开发一个系统,它将涉及大量的数据同步,并分解成小任务。我将每个小任务添加为Azure服务总线队列上的作业/消息

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

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

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

我希望能够在web界面中显示队列中的消息列表(我使用PeekBatch完成了此操作)。然后,我希望能够选择部分/全部邮件并将其删除

如果代码中有bug,并且我想停止某种类型的消息,我可能会这样做

在此基础上,我还将具有从网页重新添加消息的功能。也许我想提升我的工作人员角色和消息,以更快的速度执行任务(或降低它们的速度),或者重新添加我已删除的消息

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

编辑:

我有一些有效的方法,但它似乎不是一个很好的解决方案:

    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
        }
    }
注意,它是可为空的Guid,只是为了向后兼容

当我想删除一条消息时,我会将我的MessageId添加到数据库表“DeletedMessage”中

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

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


还要注意的是,我最初是通过使用SequenceNumber来实现的,但奇怪的是,SequenceNumber在查看和检索消息之间发生了变化!除非您使用上述自己的Id,否则此想法将无法实现。

您可以创建自己的队列清理程序,该程序具有消息侦听器,可根据消息的某些条件进行窥视、放弃或提交消息。如果您预见到需要在实际生产环境中进行清理,那么这可能是控制器中的一项操作。

根据我的实验,无法从消息队列中删除活动消息

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

通过调用
CancelScheduledMessageAsync(sequenceNumber)
可以删除计划的消息

对于活动消息,您必须确保它们在某个时刻被移动到死信队列


死信队列中的邮件随后可以被删除或重新提交。

感谢您的回复,但每当我试图偷看邮件,然后对其进行处理(完成、放弃、延迟)时,总是会出错,说它在上下文中无法执行任何操作。
Guid? MessageId { get; set; }