【问题标题】:How do you delete the dead letters in an Azure Service Bus queue?如何删除 Azure 服务总线队列中的死信?
【发布时间】:2017-08-13 13:07:03
【问题描述】:

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

请尝试以下方法:

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

【讨论】:

  • 如何在不完成其他死信消息的情况下删除特定死信消息?例如,如果有 100k 个死信,并且想删除最后一个死信,有没有办法不循环 99999 条消息?我一直在寻找使用序列号的可能性,但看起来只允许浏览和查看。
【解决方案2】:

在我们的 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;
        }
    }
}

希望有帮助!

【讨论】:

    【解决方案3】:
    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();
            }
        }
    }
    

    【讨论】:

    • 请用一些内容描述你的答案
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 2020-01-08
    • 2014-12-09
    • 2017-02-13
    • 2020-09-20
    • 2020-09-07
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多