Azure functions 在Azure服务总线队列上重新提交消息时,Messagelock令牌已过期
我有一个Azure函数,它有以下简单代码:Azure functions 在Azure服务总线队列上重新提交消息时,Messagelock令牌已过期,azure-functions,azureservicebus,azure-servicebus-queues,Azure Functions,Azureservicebus,Azure Servicebus Queues,我有一个Azure函数,它有以下简单代码: public class MyDequeuer { [FunctionName("SampleMessageExecutor")] public static async Task Run( [ServiceBusTrigger("test-queue", AccessRights.Listen, Connection = "Servi
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小时后转到死信队列并尝试修复并重新提交来自service bus explorer的消息时,我看到很多错误,说消息locktoken已过期。您应该如何处理这样一种情况:消息可能会以死信形式结束,并且可能会在数小时或数天后重新处理
我正在使用函数runtime dotnet core 3.1。实际上,关于这个问题,github中存在一个问题: 首先,消息类没有
DeadLetterAsync
方法,对于v2或更高版本,您应该使用MessageReceiver
来实现它
然后是关于锁定令牌,因为服务总线触发功能将自动完成消息,如果您想自己死信异步
,它将导致异常。您需要更改host.json,将autoComplete
更改为flase,您可以参考以下内容
下面是我的代码,抛出异常和死信
[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
}
}
}
}
实际上,关于这个问题,github中存在一个问题: 首先,消息类没有
DeadLetterAsync
方法,对于v2或更高版本,您应该使用MessageReceiver
来实现它
然后是关于锁定令牌,因为服务总线触发功能将自动完成消息,如果您想自己死信异步
,它将导致异常。您需要更改host.json,将autoComplete
更改为flase,您可以参考以下内容
下面是我的代码,抛出异常和死信
[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
}
}
}
}
能否提供详细的错误描述?在我的情况下,消息不能调用DeadLetterAsync(locktoken)。因此,我添加了一个messageReceiver参数,并且在运行该函数时确实出现了很多错误。我想问的是,你现在面临的情况是什么?你能提供一个详细的错误描述吗?在我的情况下,消息不能调用DeadLetterAsync(locktoken)。因此,我添加了一个messageReceiver参数,并且在运行该函数时确实出现了很多错误。我想问的是,你现在面对的是这样的情况吗?