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}");
}
}
如何防止邮件进入死信队列?为什么只有一个队列发生这种情况,而不是其他两个?
4条答案
按热度按时间oxalkeyp1#
当消息是死信时,添加user属性是有原因的。检查该属性以查看原因并相应地进行故障排除。具体来说,检查
DeadLetterReason
和DeadLetterErrorDescription
自定义属性。oalqel3c2#
消息成为死信的常见原因包括
由于从队列接收消息时发生的某些错误,消息也可能已成为死信。正如Sean Feldman提到的,查看DeadLetterReason和DeadLetterDescription属性将帮助您清楚地诊断错误原因。
如果DeadLetterReason为TTLExpiredException,请尝试增加或设置所发送消息的生存时间。因为如果您将消息的生存时间设置为一个较低的值,那么它将覆盖队列的生存时间属性。
检查队列是否消息被死信处理的队列是启用会话的队列,以及发送的消息是否设置了会话ID值。
jyztefdp3#
如果您发现此“会话ID为空”是原因,请在创建订阅时禁用会话。
goucqfw64#
如果没有看到你的应用程序/消息,很难提供帮助。但可能是尝试使用该消息的应用程序出错了。由于无法完成,消息将进入死信队列。
记录来自此特定队列的消息,并查看是否缺少任何必需的属性。有时候你试图将其转换为不兼容的类型。
死信队列的目的是保存无法传递给任何接收方的消息,或者无法处理的消息。