目前,我的代码中,当连接.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。因此,我无法用特定驱动程序的代码来帮助您。
但我可以看到连接对象的 IsConnected
是一个属性。这意味着它是一个公共表面,可以用来检查底层对象的状态。换句话说,它不应该仅仅因为您多次检索内部状态而导致状态变化。
您的重试逻辑应关注负责连接到 RabbitMq 实例的操作本身。
retryPolicy.Execute(() => connection.Open());
顺便说一下,您的代码从未以 false
. 要么成功,要么失败,并伴有一些超时相关的异常。