Azure:如何从Service Bus队列中删除“DeadLettered”消息

时间:2015-02-25 17:00:50

标签: c# azure servicebus azure-servicebus-queues azure-scheduler

我想从服务总线队列中删除Dead Lettered消息。特别是,这个值被称为DeadLetterMessageCount,您可以通过右键单击"属性&#来找到它。 34;项目的服务器资源管理器中的SB队列(如果使用SB队列)。

我之所以这样做,是因为我已经设置了云服务的自动缩放功能。因此,当SB队列非常大时,它会添加更多内核以便更快地处理消息(它允许更多的工作者角色)。我意识到,当您根据队列中的消息数设置缩放时,它也会计算DeadLettered消息(无法消耗的消息)。 这样就浪费了钱,因为更多的实例是不需要的。

有任何疑问,请告诉我。

感谢您的帮助

3 个答案:

答案 0 :(得分:4)

您从死信队列中读取和删除邮件的方式与从正常队列或订阅中读取的方式相同。

您可以使用此方法获取队列的路径:QueueClient.FormatDeadLetterPath(queuePath)

另见前一个答案:How do I delete a DeadLetter message on an Azure Service Bus Topic

答案 1 :(得分:0)

这是用于从队列中删除空载消息的代码。

public async void DeleteMessagesFromQueueAsync()
    {
        bool isDeadLetter=true;
        long SequenceNumber = 12;
        string queuePath='queue name';
        string connectionString='connection string of ASB Namespace';

        BrokeredMessage _srcMessage = null;
        DeleteMessageResponse _msgDeletionStatus = new DeleteMessageResponse();
        MessageReceiver fromQueueClient = null;
        try
        {
            MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connectionString);

            string _fromEntityPath = !isDeadLetter ? queuePath : QueueClient.FormatDeadLetterPath(queuePath);

            fromQueueClient = await factory.CreateMessageReceiverAsync(_fromEntityPath, ReceiveMode.PeekLock);

                BrokeredMessage _message = await fromQueueClient.ReceiveAsync(SequenceNumber);
                if (_message != null)
                    _srcMessage= _message;

            if (_srcMessage != null )
            {  
                    await _srcMessage.CompleteAsync();
            }
        }
        catch (Exception ex)
        {
        }
        finally
        {
            if (fromQueueClient != null)
                await fromQueueClient.CloseAsync();
        }
    }

答案 2 :(得分:0)

您可以使用'ReceiveAndDelete'模式和'ReceiveBatchAsync'从DeadLetterQueue快速删除

private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var DLQPath = "/$DeadLetterQueue"; ///**** Important - Pointing to DLQ'

                var topicName = "message";
                var sub = "message-subscription";
                int batchSize = 100;

                runProcess = true;

                _subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionSt, topicName, sub + DLQPath, ReceiveMode.ReceiveAndDelete);

                int cnt = 0;

                do
                {
                    var messages = await _subscriptionClient.ReceiveBatchAsync(batchSize);
                    var msgCount = messages.Count();

                    if (msgCount == 0)
                    {
                        break;
                    }
                    cnt += msgCount;
                    labelCount.Text = cnt.ToString();
                }
                while (runProcess);

                _subscriptionClient.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.GetBaseException().Message);
                return;
            }
        }