【问题标题】:ServiceBusTrigger process Deadletter messageServiceBusTrigger 处理 Deadletter 消息
【发布时间】:2018-01-23 12:52:49
【问题描述】:

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

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

我希望克隆消息将被发送到原始队列并一直留在那里直到它被处理,但是一旦调用 [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
            }
    }

【问题讨论】:

  • 您是否检查过您尝试克隆的消息是否未过期?或许你可以尝试在发送前设置它的 TTL 属性。
  • 嗨@Peter,实际上我在发送克隆消息之前已经输入了 TTL。 cloneMessage.TimeToLive = new TimeSpan(0, 10, 0);

标签: azure servicebus


【解决方案1】:

我遇到了类似的问题,然后经过很长时间的研究,我发现它在 3 个方面都非常好。

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

虽然Send 在您的方法中不起作用的原因仍然未知,但我看到CloneSend 在没有Complete 的情况下工作正常,而且看起来克隆仍然指的是原始消息。

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2019-02-09
    • 2021-05-06
    • 2017-11-30
    • 2019-10-22
    • 2021-08-02
    相关资源
    最近更新 更多