0

目前,我有代码,其中 while 循环在 connection.IsConnected = true 时被卡住

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;
    }

如果有人可以让我知道,我在代码中做错了什么。真的很有帮助

4

1 回答 1

0

从您发布的代码中,很难猜出您使用哪个 C# 驱动程序连接到 RabbitMq。因此,我将无法为您提供特定于驱动程序的代码。

但正如我所见,连接对象IsConnected是一个属性。这意味着它是一个公共表面,可用于检查底层对象的状态。换句话说,它不应该仅仅因为您多次检索内部状态而导致状态更改。

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

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

顺便说一句,您的代码永远不会返回false. 它要么成功,要么失败,并出现一些与超时相关的异常。

于 2020-06-02T08:07:22.823 回答