I'm writing a piece of code which will allow us to:
I have no issues with the first 2 points; using the Peek receive mode I can show a list of messages and we can edit and resend with no issues.
The problem comes when I want to actually delete the message from the dead letter queue.
How do we do this on a message by message level? We may only want to delete 2 of the messages residing in the dead letter queue and keep the others for reviewing at a later stage. Does calling .Complete()
on a message in the dead letter queue remove it like it does in the main subscription?
For reference; here is our code for getting the SubscriptionClient
for the dead letter queue:
private SubscriptionClient GetOrCreateSubscriptionClient(string connectionString)
{
if (!NamespaceManager.TopicExists(_topicName))
{
NamespaceManager.CreateTopic(new TopicDescription(_topicName)
{
MaxSizeInMegabytes = 5120,
DefaultMessageTimeToLive = TimeSpan.FromSeconds(DEFAULT_LOCK_DURATION_IN_SECONDS)
});
}
if (!NamespaceManager.SubscriptionExists(_topicName, _subscriptionName))
{
NamespaceManager.CreateSubscription(_topicName, _subscriptionName);
}
var deadLetterPath = SubscriptionClient.FormatDeadLetterPath(_topicName, _subscriptionName);
var client = SubscriptionClient.CreateFromConnectionString(
connectionString, deadLetterPath, _subscriptionName, ReceiveMode.PeekLock);
return client;
}
Peek a message To peek messages, select Peek Mode in the Service Bus Explorer dropdown. Check the metrics to see if there are Active Messages or Dead-lettered Messages to peek and select either Queue / Subscription or DeadLetter sub-queue. Select the Peek from start button.
The purpose of the dead-letter queue is to hold messages that can't be delivered to any receiver, or messages that couldn't be processed.
Updated code to delete a message from the dead letter queue using the new ServiceBusClient
from azure.messaging.servicebus
:
public async Task DeleteDeadLetterMessageAsync(string connectionString, string queueName, long sequenceNumber)
{
var serviceBusClient = new ServiceBusClient(connectionString);
var receiverOptions = new ServiceBusReceiverOptions { SubQueue = SubQueue.DeadLetter };
var receiver = serviceBusClient.CreateReceiver(queueName, receiverOptions);
var msg = await receiver.PeekMessageAsync(sequenceNumber);
if (msg.SequenceNumber == sequenceNumber)
{
msg = await receiver.ReceiveMessageAsync();
await receiver.CompleteMessageAsync(msg);
}
}
Yes, calling complete on the reference to the brokered message you receive from the dead letter queue will remove it from the dead letter queue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With