当前位置: 首页 > 知识库问答 >
问题:

从死信队列重新提交邮件-Azure服务总线

南门星河
2023-03-14

我在Azure中创建了一个服务总线队列,它运行良好。如果消息没有在默认尝试(10次)内传递,则将消息正确地移动到死信队列。

现在,我想从死信队列中重新提交这条消息,回到它起源的队列,看看它是否再次工作。我也尝试过使用服务总线浏览器。但它立即被转移到死信队列中。

是否有可能这样做,如果有,如何做?

共有3个答案

史昀
2023-03-14

尝试删除死信原因

resubmittableMessage.Properties.Remove("DeadLetterReason");
resubmittableMessage.Properties.Remove("DeadLetterErrorDescription");

完整代码

using Microsoft.ServiceBus.Messaging;
using System.Transactions;

namespace ResubmitDeadQueue
{
    class Program
    {
        static void Main(string[] args)
        {

            var connectionString = "";
            var queueName = "";

            var queue = QueueClient.CreateFromConnectionString(connectionString, QueueClient.FormatDeadLetterPath(queueName), ReceiveMode.PeekLock);

            BrokeredMessage originalMessage
                ;
            var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
            do
            {
                originalMessage = queue.Receive();
                if (originalMessage != null)
                {
                    using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                    {
                        // Create new message
                        var resubmittableMessage = originalMessage.Clone();

                        // Remove dead letter reason and description
                        resubmittableMessage.Properties.Remove("DeadLetterReason");
                        resubmittableMessage.Properties.Remove("DeadLetterErrorDescription");

                        // Resend cloned DLQ message and complete original DLQ message
                        client.Send(resubmittableMessage);
                        originalMessage.Complete();

                        // Complete transaction
                        scope.Complete();
                    }
                }
            } while (originalMessage != null);
        }
    }
}

感谢这里的一些其他回复!

伍皓
2023-03-14

这可能是Peter Berggreen指出的“重复消息检测”,或者更可能是,如果您直接将代理消息从死信队列移动到实时队列,那么DeliveryCount仍将处于最大值,并且它将返回死信队列。

从死信队列中提取BrokeredMessage,使用GetBody()获取内容,使用该数据在新的BrokeredMessage中创建并将其发送到队列。您可以在一个安全的庄园中这样做,通过使用peek从死信队列中获取消息内容,然后在从死信队列中删除消息之前将新消息发送到活动队列。这样,如果由于某种原因未能写入活动队列,您就不会丢失任何关键数据。

使用新的BrokeredMessage,您不应该有“重复消息检测”的问题,并且DeliveryCount将被重置为零。

司承业
2023-03-14

您需要发送具有相同负载的新消息。ASB按设计不支持邮件重新提交。

 类似资料:
  • 我正在使用azure服务总线主题和订阅机制,并希望处理所有在死信队列中的消息。 此外,我想通过C#中的Azure Web作业处理消息,并将其发送回队列。所以我想知道如何通过我的应用程序处理死信队列上的消息?

  • 使用WebJobs SDK时,将代理消息移动到死信队列的正确方法是什么?通常我会打电话给味精。死信()。但是,SDK负责管理代理消息的生命周期。它将调用msg。如果方法返回成功,则返回Complete(),如果发生异常,则将重试该消息。我需要第三种情况,告诉ServiceBus队列将消息移动到死信队列,因为它是一条坏消息。

  • > 在Azure Service Bus主题中,我有两个订阅subscription1和subscription2。我正在向主题发送一条消息。在subscription1中,消息被放弃,在subscription2中,消息被处理。subscription1中的已放弃消息是否将再次发送给两个订阅或仅发送给已放弃消息的订阅。 我也有点困惑,死信队列将是所有订阅都通用的,还是每个订阅都有一个单独的死信队

  • 一旦部署到云,我无法从Azure网站访问Azure服务总线队列。在localhost上运行时,如果工作正常,我可以向队列发送消息,但如果我部署应用程序,在远程服务器上创建QueueClient时会出现异常: “套接字连接被中止,因为对套接字的异步发送未在分配的超时00:00:59.4820817内完成。分配给此操作的时间可能是更长超时的一部分。” 我正在使用QueueClient。CreateFr

  • 是否需要删除/清除Azure门户中Azure服务总线队列中的活动/死信消息?目前,我们已经向队列发送了几条消息,而活动消息和一些死信消息都无缘无故地保留在那里,并且我们的服务总线用户没有以某种方式触发,因此我们希望删除这些消息,以使队列再次干净。为了等到服务总线在过期后丢弃这些消息,我们可以自己手动删除它们吗?

  • 如何获取Azure服务总线队列中死信消息的数量? 我可以像这样得到队列中的计数。。。 但这看起来既包括队列中的消息,也包括关联死信队列中的消息 我如何区分它们?