为什么我的邮件总是传递到Azure服务总线中的死信队列?

sd2nnvve  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(131)

C# .NetCore 2.2 - Azure Service Bus 3.4.0

我在Azure服务总线中有3个具有相同属性的队列。在向这些队列发送消息时,其中一个队列中的消息总是被传递到死信队列,而其他两个队列则接收活动消息。
我试过玩的属性-增加TTL,最大交付计数等。所有3个队列的属性都是相同的,唯一的区别是队列的名称。
我用过这个教程-https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues
queue properties image
public int findDuplicate(int numberOfMessagesToSend){

try

{

    for (var i = 0; i < numberOfMessagesToSend; i++)

    {

        // Create a new message to send to the queue.

        string messageBody = $"Message {i}";

        var message = new Message(Encoding.UTF8.GetBytes(messageBody));

        Console.WriteLine($"Sending message: {messageBody}");

        // Send the message to the queue.
        await queueClient.SendAsync(message);
    }
}
catch (Exception exception)
{
    Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
}

}

如何防止邮件进入死信队列?为什么只有一个队列发生这种情况,而不是其他两个?

oxalkeyp

oxalkeyp1#

当消息是死信时,添加user属性是有原因的。检查该属性以查看原因并相应地进行故障排除。具体来说,检查DeadLetterReasonDeadLetterErrorDescription自定义属性。

oalqel3c

oalqel3c2#

消息成为死信的常见原因包括

  • 超过最大传输跃点计数
  • 会话ID为“”
  • TTL过期异常
  • 标题大小超出

由于从队列接收消息时发生的某些错误,消息也可能已成为死信。正如Sean Feldman提到的,查看DeadLetterReason和DeadLetterDescription属性将帮助您清楚地诊断错误原因。
如果DeadLetterReason为TTLExpiredException,请尝试增加或设置所发送消息的生存时间。因为如果您将消息的生存时间设置为一个较低的值,那么它将覆盖队列的生存时间属性。
检查队列是否消息被死信处理的队列是启用会话的队列,以及发送的消息是否设置了会话ID值。

jyztefdp

jyztefdp3#

如果您发现此“会话ID为空”是原因,请在创建订阅时禁用会话。

goucqfw6

goucqfw64#

如果没有看到你的应用程序/消息,很难提供帮助。但可能是尝试使用该消息的应用程序出错了。由于无法完成,消息将进入死信队列。
记录来自此特定队列的消息,并查看是否缺少任何必需的属性。有时候你试图将其转换为不兼容的类型。
死信队列的目的是保存无法传递给任何接收方的消息,或者无法处理的消息。

相关问题