public Task<ErrorHandleResult> Invoke(ErrorContext errorContext)
{
var recoveryAction = recoverabilityPolicy(configuration, errorContext);
// When we can't do immediate retries and policy did not honor MaxNumberOfRetries for ImmediateRetries
if (recoveryAction is ImmediateRetry && !immediateRetriesAvailable)
{
Logger.Warn("Recoverability policy requested ImmediateRetry however immediate retries are not available with the current endpoint configuration. Moving message to error queue instead.");
return MoveToError(errorContext, configuration.Failed.ErrorQueue);
}
if (recoveryAction is ImmediateRetry)
{
return RaiseImmediateRetryNotifications(errorContext);
}
// When we can't do delayed retries, a policy customization probably didn't honor MaxNumberOfRetries for DelayedRetries
if (recoveryAction is DelayedRetry && !delayedRetriesAvailable)
{
Logger.Warn("Recoverability policy requested DelayedRetry however delayed delivery capability is not available with the current endpoint configuration. Moving message to error queue instead.");
return MoveToError(errorContext, configuration.Failed.ErrorQueue);
}
var delayedRetryAction = recoveryAction as DelayedRetry;
if (delayedRetryAction != null)
{
return DeferMessage(delayedRetryAction, errorContext);
}
var moveToError = recoveryAction as MoveToError;
if (moveToError != null)
{
return MoveToError(errorContext, moveToError.ErrorQueue);
}
Logger.Warn("Recoverability policy returned an unsupported recoverability action. Moving message to error queue instead.");
return MoveToError(errorContext, configuration.Failed.ErrorQueue);
}