public async Task<IReceivedMessageInternal> ReceiveMessageAsync(IMessageContext context)
{
context.Commit += ContextOnCommit;
context.Rollback += ContextOnRollback;
context.Cleanup += context_Cleanup;
TimeSpan? timeout = null;
IMessageId messageId = null;
var rpc = context.Get(_headers.StandardHeaders.RpcContext);
if (rpc?.Timeout != null)
{
timeout = rpc.Timeout;
}
if (rpc?.MessageId != null)
{
messageId = rpc.MessageId;
}
using (
var workSub = rpc?.MessageId != null && rpc.MessageId.HasValue
? _workSubFactory.Create(rpc.MessageId)
: _workSubFactory.Create())
{
while (true)
{
if (_cancelWork.Tokens.Any(m => m.IsCancellationRequested))
{
return null;
}
var message = await GetMessageAsync(context, messageId).ConfigureAwait(false);
if (message != null && !message.Expired)
{
return message.Message;
}
if (_cancelWork.Tokens.Any(m => m.IsCancellationRequested))
{
return null;
}
workSub.Reset();
message = GetMessage(context, messageId);
if (message != null && !message.Expired)
{
return message.Message;
}
if (message != null && message.Expired)
{
continue;
}
if (workSub.Wait(timeout))
{
continue;
}
return null;
}
}
}