gpt4 book ai didi

azure - ServiceBusTrigger处理Deadletter消息

转载 作者:行者123 更新时间:2023-12-02 06:01:27 25 4
gpt4 key购买 nike

我有一个当前主题队列,它将一些消息发送到死信队列。我正在创建另一个 Webjob,它监听死信队列上的 ServiceBusTrigger。目的是将死信消息重新提交到原来的队列中重新处理

当新消息到达死信队列时,我会克隆该消息并将其发送回原始主题订阅以重新处理。

我希望克隆消息将被发送到原始队列并保留在那里直到被处理,但事实证明,一旦调用 [originalTopicClient.Send(cloneMessage);] 函数,消息就会完成。

我错过了什么吗?

public void ProcessQueueMessage([ServiceBusTrigger(topicName, dlqSubscription)] string message, TextWriter log)
{
MessagingFactory factory = MessagingFactory.Create(ServiceURI, tokenProvider);

string deadLetterQueuePath = SubscriptionClient.FormatDeadLetterPath(topicName, SubscriptionName);

SubscriptionClient dlqSubscriptionClient = factory.CreateSubscriptionClient(topicName, "mytopicsubscription/$DeadLetterQueue");
QueueClient deadletterQueueClient = factory.CreateQueueClient(deadLetterQueuePath);
BrokeredMessage cloneMessage;
Microsoft.ServiceBus.Messaging.TopicClient originalTopicClient = Microsoft.ServiceBus.Messaging.TopicClient.CreateFromConnectionString(serviceBusEndpoint, topicName);

BrokeredMessage dlqMessage;
if ((dlqMessage = dlqSubscriptionClient.Receive()) != null)
{
cloneMessage = dlqMessage.Clone();
cloneMessage.Properties.Remove("DeadLetterReason");
cloneMessage.Properties.Remove("DeadLetterErrorDescription");

originalTopicClient.Send(cloneMessage); //resend the clone message to original queue


dlqMessage.Complete(); //deadletter queue mesg completed
}
}

最佳答案

我遇到了类似的问题,经过相当长的研究,我发现它在 3 方面工作得非常好。

第一个是以ReceiveAndDelete方式接收消息。这将从 DLQ 中删除消息,因此我们可以安全地将其发送到主队列,不会出现任何问题。第二种方式是以PeekLock模式接收消息,Complete消息,然后Send它。这与第一种方法没有什么不同,只是由我们完成而不是由服务总线客户端完成。第三种方法是创建一个新的 BrokeredMessage 并从收到的消息中复制必要的有效负载,并将其作为全新的消息发送到主队列。

虽然 Send 在您的方法中不起作用的原因仍然未知,但我发现 CloneSend 可以正常工作,无需完成,看起来克隆仍然引用原始消息。

关于azure - ServiceBusTrigger处理Deadletter消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48402263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com