4

基本的な .NET Core アプリケーションにある Polly の「再試行」コードをテストしようとしています。(継承されたインターフェイスを介して) 非同期メソッドを実装する必要があります。

public Task AddMessageAsync( ... ) { .. }

async上記のメソッドがキーワードで装飾されていないことに注意してください。わざとそうしました。

このサービスのホスト名を間違った/タイプミスしたサードパーティ サービス (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;したがって、このメソッドで呼び出されるコードがないため、 a を返すだけでよいと思いました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 回再試行し続けていません。

4

1 に答える 1