Soru

Zorluk: OrtaImplement Azure Service Bus Solutions

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?

  1. 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);
    }
    }
    Cevap
  2. B
    csharp
    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);
    }
    }
  3. C
    csharp
    ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
    {
    ReceiveMode = ServiceBusReceiveMode.PeekLock
    });
    ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
    if (message != null)
    {
    await ProcessPaymentAsync(message);
    }
  4. D
    csharp
    ServiceBusReceiver receiver = client.CreateReceiver("payments", new ServiceBusReceiverOptions
    {
    ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete
    });
    ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
    if (message != null)
    {
    await ProcessPaymentAsync(message);
    }

Cevap

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.

Adım Adım Çözüm

1
Select the appropriate ServiceBusReceiveMode.
Use ServiceBusReceiveMode.PeekLock.
PeekLock ensures the message is locked during processing and remains in the queue if the process crashes, preventing message loss.
2
Determine the message settlement mechanism.
Explicitly call CompleteMessageAsync when processing succeeds.
Because ServiceBusReceiver does not support auto-completion, messages must be manually completed to delete them from the queue after successful processing.
3
Handle processing exceptions.
Catch exceptions and call AbandonMessageAsync.
Abandoning the message releases the lock immediately so another receiver instance can reprocess the message without waiting for the lock duration to expire.

Anahtar Kavram

Azure Service Bus receive modes and message settlement lifecycle.
Tahmini Süre:1m 30s
Bu soruyu puanla