如何删除 Azure 服务总线队列中的死信?

How do you delete the dead letters in an Azure Service Bus queue?

如何删除 Azure 服务总线队列中的死信?

我可以处理队列中的消息...

var queueClient = QueueClient.CreateFromConnectionString(sbConnectionString, queueName);
while (queueClient.Peek() != null)
{
    var brokeredMessage = queueClient.Receive();
    brokeredMessage.Complete();
}

但无论如何都看不到处理死信消息

诀窍是获取队列的 deadletter path,您可以使用 QueueClient.FormatDeadLetterPath(queueName).

获取队列

请尝试以下操作:

var queueClient = QueueClient.CreateFromConnectionString(sbConnectionString, QueueClient.FormatDeadLetterPath(queueName));
while (queueClient.Peek() != null)
{
    var brokeredMessage = queueClient.Receive();
    brokeredMessage.Complete();
}

我们的 GitHub 示例存储库 (https://github.com/Azure-Samples/azure-servicebus-messaging-samples) 中提供了一些很棒的示例。 DeadletterQueue 项目应该向您展示如何在您的代码中执行此操作的示例:

    var dead-letterReceiver = await receiverFactory.CreateMessageReceiverAsync(
            QueueClient.FormatDeadLetterPath(queueName), ReceiveMode.PeekLock);
    while (true)
    {
        var msg = await dead-letterReceiver.ReceiveAsync(TimeSpan.Zero);
        if (msg != null)
        {
            foreach (var prop in msg.Properties)
            {
                Console.WriteLine("{0}={1}", prop.Key, prop.Value);
            }
            await msg.CompleteAsync();
        }
        else
        {
            break;
        }
    }
}

希望对您有所帮助!

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Core;
using System.Text;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace ClearDeadLetterQ
{
    [TestClass]
    public class UnitTest1
    {

        const string ServiceBusConnectionString = "Endpoint=sb://my-domain.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=youraccesskeyhereyouraccesskeyhere";


        [TestMethod]
        public async Task TestMethod1()
        {
            await this.ClearDeadLetters("my.topic.name", "MySubscriptionName/$DeadLetterQueue");
        }

        public async Task ClearDeadLetters(string topicName, string subscriptionName)
        {
            var messageReceiver = new MessageReceiver(ServiceBusConnectionString, EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName), ReceiveMode.PeekLock);
            var message = await messageReceiver.ReceiveAsync();
            while ((message = await messageReceiver.ReceiveAsync()) != null)
            {
                await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
            }
            await messageReceiver.CloseAsync();
        }
    }
}