Polly重试不工作,重试时没有添加日志。

问题描述 投票:0回答:1

目前,我的代码中,当连接.IsConnected = true时,while循环被卡住了。

private  bool TryConnect()
    {
        if (!connection.IsConnected)
        {
            Monitor.Enter(_syncRoot);
            try
            {
                while (!connection.IsConnected)
                {
                    Thread.Sleep(100);
                }
            }
            finally
            {
                Monitor.Exit(_syncRoot);
            }
        }
        return true;
    }

所以对于这个问题,我试过用Polly重试来代替,但是使用Polly不等待,也不添加日志。

private  bool TryConnect()
    {
        if (!connection.IsConnected)
        {
            Monitor.Enter(_syncRoot);
            try
            {
                var policy = Policy.HandleResult<bool>(r => r == false)
                    .WaitAndRetry(_retryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
                        (ex, time) =>
                        {
                            Log.LogInformation(
                                "retry {TimeOut}s");
                        }
                    );
                policy.Execute(() => connection.IsConnected);
            }
            finally
            {
                Monitor.Exit(_syncRoot);
            }
        }
        return true;
    }

如果有人能让我知道,我在代码上做错了什么。这将是真正的帮助

c# rabbitmq polly retry-logic
1个回答
0
投票

从您发布的代码中很难猜出您使用的是哪个 C# 驱动程序来连接 RabbitMq。因此,我无法用特定驱动程序的代码来帮助您。

但我可以看到连接对象的 IsConnected 是一个属性。这意味着它是一个公共表面,可以用来检查底层对象的状态。换句话说,它不应该仅仅因为您多次检索内部状态而导致状态变化。

您的重试逻辑应关注负责连接到 RabbitMq 实例的操作本身。

retryPolicy.Execute(() => connection.Open());

顺便说一下,您的代码从未以 false. 要么成功,要么失败,并伴有一些超时相关的异常。

© www.soinside.com 2019 - 2024. All rights reserved.