You are developing a .NET console application that processes payment transaction messages from an Azure Service Bus queue named `payments`. The application must retrieve messages one by one. To prevent transaction loss, messages must remain in the queue if processing fails or if the application crashes, and must be permanently removed only after successful processing. Which code snippet should you use to implement this message processing logic?
- csharp
ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
{
ReceiveMode = ServiceBusReceiveMode.PeekLock
});
ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
if (message != null)
{
try
{
await ProcessPaymentAsync(message);
await receiver.CompleteMessageAsync(message);
}
catch (Exception)
{
await receiver.AbandonMessageAsync(message);
}
}
Answer - Bcsharp
ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
{
ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete
});
ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
if (message != null)
{
try
{
await ProcessPaymentAsync(message);
await receiver.CompleteMessageAsync(message);
}
catch (Exception)
{
await receiver.AbandonMessageAsync(message);
}
} - Ccsharp
ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
{
ReceiveMode = ServiceBusReceiveMode.PeekLock
});
ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
if (message != null)
{
await ProcessPaymentAsync(message);
} - Dcsharp
ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
{
ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete
});
ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
if (message != null)
{
await ProcessPaymentAsync(message);
}
Answer
Initialize the ServiceBusReceiver with ServiceBusReceiveMode.PeekLock, then process the message in a try-catch block where you call CompleteMessageAsync on success and AbandonMessageAsync on failure.
The correct implementation configures the ServiceBusReceiver to use PeekLock mode. Under PeekLock, the message is locked from other receivers but remains in the queue. The application must explicitly call CompleteMessageAsync to remove the message from the queue when processing succeeds, or call AbandonMessageAsync to release the lock immediately if an exception is caught.
Step-by-Step Solution
Key Concept
Azure Service Bus receive modes and message settlement lifecycle.
Estimated Time:1m 30s