gpt4 book ai didi

c# - 在 .NET Core 应用程序中运行 Polly Policy 时,它在捕获到异常后挂起

转载 作者:行者123 更新时间:2023-11-30 12:20:05 25 4
gpt4 key购买 nike

我正在尝试测试基本 .NET Core 应用程序中的一些 Polly“重试”代码。我必须实现一个异步方法(通过继承的接口(interface)):

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 次。

最佳答案

您应该始终尝试在问题中提供一个最小的工作示例来说明您面临的问题。我拿了你的代码并试图让它成为一个运行示例,但一切似乎都按预期工作。它重复了 14 次,并且没有像您描述的那样挂起。

也许通过以类似的方式简化您的代码,您可以找出您的情况出了什么问题。祝你好运!

class Program
{
static void Main()
{
var msg = new MyMessageClass();
msg.AddMessageAsync("content", TimeSpan.MaxValue, TimeSpan.MaxValue, new CancellationToken());
}
}

class MyMessageClass
{
readonly ILogger _logger = NLog.LogManager.GetCurrentClassLogger();
private static Policy CheckRabbitMQPolicy(ILogger logger)
{
return Policy
.Handle<Exception>()
.WaitAndRetry(14, _ => TimeSpan.FromSeconds(2),
(exception, timeSpan, __) =>
{
logger.Warn(exception.Message);
});
}
public Task AddMessageAsync(string content,
TimeSpan? timeToLive,
TimeSpan? initialVisibilityDelay,
CancellationToken cancellationToken)
{
var policyResult = CheckRabbitMQPolicy(_logger).ExecuteAndCapture(() => throw new Exception("Connection error"));

return policyResult.Outcome == OutcomeType.Successful
? Task.CompletedTask
: Task.FromException(policyResult.FinalException);
}
}

关于c# - 在 .NET Core 应用程序中运行 Polly Policy 时,它在捕获到异常后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com