Azure服务总线从订阅的死信队列中删除特定消息

问题描述

我正在使用下面的代码尝试从订阅的死信队列中删除特定消息。我正在使用PeekBySequenceNumberAsync来获取特定的消息。问题在于该方法显然未设置锁定令牌。我收到以下错误:“提供的锁无效。该锁已过期,或者该消息已从队列中删除,或者已由其他接收者实例接收。”

关于如何从订阅死信队列中删除特定消息的任何想法?我正在使用.net核心Microsoft.Azure.ServiceBus库。

    public async Task<bool> DeleteMessage(long sequenceNumber,string topicPath,string subscriptionName,bool deadLettered = false)
    {
        bool success = false;

        string connectionString = Environment.GetEnvironmentvariable("SB_CONNECTION_STRING");

        MessageReceiver receiver = null;
        try
        {
            string path = EntityNameHelper.FormatSubscriptionPath(topicPath,subscriptionName);

            if (deadLettered)
                path = EntityNameHelper.FormatDeadLetterPath(path);

            receiver = new MessageReceiver(connectionString,path,ReceiveMode.PeekLock );

            var message = await receiver.PeekBySequenceNumberAsync(sequenceNumber);


            // If we have found the message
            if (message != null)
            {
                await receiver.CompleteAsync(message.SystemProperties.LockToken);
                success = true;

            }
            else
            {
                Console.WriteLine("Message with sequence number: " + sequenceNumber.ToString() + " was not found");
            }

        }
        catch (ServiceBusException e)
        {
            if (!e.IsTransient)
            {
                Console.WriteLine(e.Message);
            }
        }
        finally
        {
            if (receiver!=null)
                await receiver.CloseAsync();
        }

        return success;

    }

解决方法

您不应窥视邮件,而应收到它。窥视操作不会获得消息锁,因为它的预期用途是“浏览”消息的内容。

Track 0 SDK中可以通过其sequenceNumber接收消息。不幸。看起来Track 1 SDK失去了该选项。

任何发现此问题/答案的人都应查看SDK issue

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...