我有Azure的主要功能应用程序,处理来自服务总线的消息。
如果由于API下降而发生异常,则将消息推入死信队列。
我有另一个天蓝色死神功能应用程序,它不断读取DLQ并将消息推回主队列。
并且主函数应用程序检查api是否下降,然后再将消息推送到DLQ,这应该继续下去,直到API上升,主函数应用程序成功地处理消息为止。
但问题是经过一段时间消息自动清除。
我检查默认的消息存活时间是2小时30分钟,但是消息不能停留这么长时间。当我将消息推回Main时,我认为在死函数应用程序中。在主队列中,消息可能是重复的,但不确定。
在给定的默认消息生存期内,我应该如何将消息保存到DLQ中?

死信功能应用程序代码,将消息推回主队列-
MessageSender sender = new MessageSender(Environment.GetEnvironmentVariable("ConnectionStringSettingName"), UtilityHelper.GetAndValidateAppSetting("TopicName"), RetryPolicy.Default);
Message deadLetterMessage = new Message(message.Body);
foreach (KeyValuePair<string, object> userProperty in message.UserProperties)
{
deadLetterMessage.UserProperties.Add(userProperty.Key, userProperty.Value);
}
//Send the message to the Active Queue
await sender.SendAsync(deadLetterMessage);主要功能应用程式码-
[FunctionName("ProcessMessage")]
public static async System.Threading.Tasks.Task RunAsync([ServiceBusTrigger("mytopic", "mysub", Connection = "ConnectionStringSettingName")]Message mySbMsg, string lockToken, MessageReceiver messageReceiver, ILogger log)
{
try
{
log.LogInformation("Process message...");
}
catch (Exception ex)
{
log.LogInformation($"Send message to dead-letter: {ex}");
await messageReceiver.DeadLetterAsync(lockToken);
}
}我的逻辑是:在API启动之前,我将消息发送到DLQ和DLQ函数应用程序中,将其推回主队列,这样就不会丢失消息。
更新
找出根本原因:
Microsoft.Azure.ServiceBus.ServiceBusCommunicationException:套接字上的操作无法执行,因为系统缺少足够的缓冲区空间,或者由于队列已满-- ErrorCode: NoBufferSpaceAvailable --> System.Net.Sockets.SocketException:由于系统缺乏足够的缓冲区空间或队列在Microsoft.Azure.ServiceBus.ServiceBusConnection.CreateConnectionAsync(TimeSpan超时时已满,无法对套接字执行操作)
如何处理这件事?
发布于 2020-10-01 13:06:22
默认的“存活消息时间”设置将而不是应用于死信。根据文档
DLQ没有自动清理。消息一直保留在DLQ中,直到您从DLQ中显式地检索它们,并对死信消息调用Complete()。
将死信消息返回到原始队列的函数的上面的代码将完成每个死信消息,而这些消息将从死信队列中消失。
https://stackoverflow.com/questions/64152317
复制相似问题