我正在尝试测试我在基本 .NET Core 应用程序中的一些 Polly“重试”代码。我必须实现一个异步方法(通过继承的接口):
public Task AddMessageAsync( ... ) { .. }
注意上面的方法没有用async
关键字修饰吗?我是故意这样做的。
当我尝试连接到第 3 方服务(RabbitMQ 服务器)时,我在其中设置了该服务的主机名,不正确/错别字,我的同步代码尝试并失败并引发异常。伟大的!但在那之后,代码只是挂起?我认为代码应该继续重试。
private static Policy CheckRabbitMQPolicy(ILogger logger)
{
return Policy
.Handle<Exception>()
.WaitAndRetry(15, _ => TimeSpan.FromSeconds(2), (exception, timeSpan, __) => logger.LogWarning(...));
}
public Task AddMessageAsync(string content,
TimeSpan? timeToLive,
TimeSpan? initialVisibilityDelay,
CancellationToken cancellationToken)
{
CheckRabbitMQPolicy(_logger).Execute(() =>
{
using (var connection = _factory.CreateConnection())
{
.... // snipped //
}
});
return Task.CompletedTask;
}
所以我想我可以只返回一个Task.CompletedTask;
,因为在这个方法中没有调用任何代码async/await
。但是当抛出异常时,它会被处理(log.Warning(..)
如果那里有断点,则会被调用/中断),然后挂起。
我如何调试这里发生的事情?
编辑
根据@jeremy-thompson 下面的回复,我想我可以尝试将代码更改为:
var policyResult = CheckRabbitMQPolicy(_logger).ExecuteAndCapture(() =>
{
using (var connection = _factory.CreateConnection())
{
.... // snipped //
}
});
return policyResult.Outcome == OutcomeType.Successful
? Task.CompletedTask
: Task.FromException(policyResult.FinalException);
那么这个:
- 尝试连接到坏服务器
- 失败并抛出异常
- 现在退出 ExecuteAndCapture() (不再返回 14 次......)
- 返回
Task.FromException
...
这有点接近,但仍然不会再重试 14 次。