async Task<bool> ProcessMessage(MessageQueueTransaction msmqTransaction, Message message, Dictionary<string, string> headers)
{
var transportTransaction = new TransportTransaction();
transportTransaction.Set(msmqTransaction);
MsmqFailureInfoStorage.ProcessingFailureInfo failureInfo;
var shouldTryProcessMessage = true;
if (failureInfoStorage.TryGetFailureInfoForMessage(message.Id, out failureInfo))
{
var errorHandleResult = await HandleError(message, headers, failureInfo.Exception, transportTransaction, failureInfo.NumberOfProcessingAttempts).ConfigureAwait(false);
shouldTryProcessMessage = errorHandleResult != ErrorHandleResult.Handled;
}
if (shouldTryProcessMessage)
{
try
{
using (var bodyStream = message.BodyStream)
{
var shouldAbortMessageProcessing = await TryProcessMessage(message.Id, headers, bodyStream, transportTransaction).ConfigureAwait(false);
if (shouldAbortMessageProcessing)
{
return false;
}
}
}
catch (Exception exception)
{
failureInfoStorage.RecordFailureInfoForMessage(message.Id, exception);
return false;
}
}
failureInfoStorage.ClearFailureInfoForMessage(message.Id);
return true;
}