Access to the native Azure Storage Queues incoming message
Accessing the native azure storage queue's incoming message from behaviors and handlers can be beneficial for customizations and recoverability. When a message is received, the transport includes the native QueueMessage
in the message processing context. You can use the following code to retrieve the message details from a pipeline behavior:
class DoNotAttemptMessageProcessingIfMessageIsNotLocked : Behavior<ITransportReceiveContext>
{
public override Task Invoke(ITransportReceiveContext context, Func<Task> next)
{
var NextVisibleOnUtc = context.Extensions.Get<QueueMessage>().NextVisibleOn;
if (NextVisibleOnUtc <= DateTime.UtcNow)
{
return next();
}
throw new Exception($"Message lock lost for MessageId {context.Message.MessageId} and it cannot be processed.");
}
}
The above behavior utilizes the native message’s NextVisibleOn
property to identify when the message lost its lock due to aggressive prefetching and slow processing. If needed, a custom recoverability policy can be implemented to bypass retry attempts that would inevitably fail because of the lost lock.