如何避免将消息发送到`deadletter`队列天蓝色服务总线

问题描述

我正在使用来自服务总线主题/订阅的消息。 ProcessMessage将消息添加到一个容量受限队列(一次不超过200条消息)。完成一个消息处理后,只有当CompleteAsync给出ProcessMessage时,我才进行true

现在,如果发生某些异常,例如说队列已满并且不准备接收任何新消息,那么我正在生成异常,并且ProcessMessage给出了false。在这种情况下,_subscriptionClient.CompleteAsync没有被调用,但是消息将进入deadletter队列。

如何防止这种情况?邮件不应该进入deadletter队列,而应该等待一段时间来处理?

注意-根据评论建议,我添加了AbandonAsync逻辑,但该消息仍然会死信并且不会在主题订阅中再次出现。请提出建议!

最大投放次数= 5,已尝试5次,然后将其移入死信状态

_subscriptionClient = new SubscriptionClient(connectionString,topicName,subscriptionName);

            _subscriptionClient.RegisterMessageHandler(
                async (message,token) =>
                {
                    if (await ProcessMessage(message,token))
                    {
                        await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                    }
                    else
                    {
                        await _subscriptionClient.AbandonAsync(message.SystemProperties.LockToken);
                    }
                },new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 1,AutoComplete = false });


  private async Task<bool> ProcessMessage(Message message,CancellationToken token)
    {
       var processed = false;
       try
        {
           //adding message to queue for further process
           processed = true;
           
        }
        catch
        {
            //in case  queue  is full,generating exception and return false
            processed = false;
        }

        return processed;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)