1

我想从服务总线队列中删除死信消息。具体来说,这个值称为 DeadLetterMessageCount,您可以通过在项目的服务器资源管理器中右键单击 SB 队列的“属性”来找到它(如果使用 SB 队列)。

我想这样做的原因是因为我已经设置了云服务的自动缩放。因此,当 SB 队列很大时,它会添加更多内核以更快地处理消息(它启用更多工作角色)。我意识到,当您根据队列中的消息数量设置缩放时,它也会计算 DeadLettered 消息(无法使用的消息)。所以这是浪费金钱,因为启用了更多不需要的实例。

有任何疑问,请告诉我。

谢谢你的帮助

4

3 回答 3

4

您从死信队列中读取和删除消息的方式与从普通队列或订阅中读取的方式相同。

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

另请参阅之前的答案:如何在 Azure 服务总线主题上删除死信消息

于 2015-02-25T23:01:56.137 回答
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();
        }
    }
于 2018-09-21T09:05:32.090 回答
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;
            }
        }
于 2019-11-18T16:38:14.767 回答