azure-functions - 在 Azure 服务总线队列上重新提交消息时消息锁定令牌已过期
问题描述
我有一个 Azure 函数,它具有以下简单代码:
public class MyDequeuer
{
[FunctionName("SampleMessageExecutor")]
public static async Task Run(
[ServiceBusTrigger("test-queue", AccessRights.Listen, Connection = "ServiceBusConnectionString")]
Message inMessage, string locktoken, ILogger log, ExecutionContext ctx)
{
try {
some code..
} catch(Exception e) {
await inMessage.DeadLetterAsync(locktoken);
}
}
}
这工作正常。但是,当我稍后说可能 1 小时后或 24 小时后进入死信队列并尝试修复并重新提交来自服务总线资源管理器的消息时,我会看到很多错误,表明消息锁定令牌已过期。您应该如何处理消息可能以死信告终并可能在数小时或数天后重新处理的情况?
我正在使用函数运行时 dotnet core 3.1。
解决方案
实际上,关于这个问题,github 中有一个问题:如何在 azure functions v2 中故意死信一条消息。
首先,没有DeadLetterAsync
Message 类的方法,您应该使用 v2 或更高版本MessageReceiver
来实现它。
然后是关于锁定令牌,导致服务总线触发功能会自动完成消息,如果您想 DeadLetterAsync
自己完成会导致异常。您需要更改host.json,将其更改autoComplete
为flase,您可以参考此host.json设置。
下面是我的代码,抛出异常和死信。
[FunctionName("Function1")]
public static async System.Threading.Tasks.Task RunAsync([ServiceBusTrigger("myqueue",Connection = "ServiceBusConnectionString")]string myQueueItem, MessageReceiver messageReceiver, string lockToken, ILogger log)
{
try
{
throw new Exception();
}
catch (Exception) {
await messageReceiver.DeadLetterAsync(lockToken);
log.LogInformation(myQueueItem+ " is put into deadletter");
}
}
这是我的host.json。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"prefetchCount": 100,
"messageHandlerOptions": {
"autoComplete": false,
"maxConcurrentCalls": 32,
"maxAutoRenewDuration": "00:55:00"
},
"sessionHandlerOptions": {
"autoComplete": false,
"messageWaitTimeout": "00:00:30",
"maxAutoRenewDuration": "00:55:00",
"maxConcurrentSessions": 16
}
}
}
}
推荐阅读
- php - MySQL更新查询join和join left
- jenkins - Jenkins 构建:无法为锁定文件/home/ubuntu/.gradle/.../gradle-6.7.1-all.zip.lck 创建父目录
- python - Discord.gateway 警告“Shard ID 无心跳阻塞超过 10 秒。” 在使用熊猫时
- amazon-web-services - Terraform:在创建资源时替换函数在 for_each 中不起作用
- python - TypeError:无法将 str 连接到 google indexing API 的字节
- sql-server - 为什么 SQL Server UPDATE 查询只从源复制第一行,而不是从源复制所有行?
- javascript - Chrome 扩展如何使用列表/数组?
- gnu-make - 也在标准输出上显示 $(shell xx ) 命令的输出
- docker - 在生产环境中使用 Ubuntu 操作系统运行 docker for windows 进行本地开发
- html - 使用剪辑路径的弯曲背景图像