Azure functions 如何在Azure服务总线触发的Azure功能V3之后获取底层MessageReceiver引用
我已将Azure功能配置为在触发Azure功能时不“自动完成”消息。我的问题是我需要自己标记消息完成,并在事务上下文中这样做(见下文)。此使用“via”路由的事务在控制台应用程序中工作,但在Azure中由于缺少对消息出列的原始接收方的引用而失败 如何获取底层接收器引用,以便我可以完成并以原子方式发送?在Azure函数中似乎无法做到这一点Azure functions 如何在Azure服务总线触发的Azure功能V3之后获取底层MessageReceiver引用,azure-functions,azureservicebus,Azure Functions,Azureservicebus,我已将Azure功能配置为在触发Azure功能时不“自动完成”消息。我的问题是我需要自己标记消息完成,并在事务上下文中这样做(见下文)。此使用“via”路由的事务在控制台应用程序中工作,但在Azure中由于缺少对消息出列的原始接收方的引用而失败 如何获取底层接收器引用,以便我可以完成并以原子方式发送?在Azure函数中似乎无法做到这一点 using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) {
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
await receiver.CompleteAsync(completeMessage.SystemProperties.LockToken);
for (var i = 0; i <= sendMessages.Length - 1; i++)
await sender.SendAsync(sendMessages[i]);
ts.Complete();
}
catch (Exception ex)
{
// This rolls back send and complete in case an exception happens
}
}
您需要注入函数用于接收传入消息的消息接收器。注入通过功能参数完成。详细介绍。这是一篇非常有用的帖子。它让我走得更远,我现在得到错误:Microsoft.Azure.ServiceBus.ServiceBusException:事务尚未声明,或已被解除。因此,我正在逐行调试。这是对您确切问题的回答。我还确认,我的第二个问题是因为我从配置创建了一个新的连接对象,而不是重用传递给函数的Run()方法的连接。这样就可以了。你们不需要建立一个新的连接,因为信息接收者会给你们自己的。我可以确认肖恩·费尔德曼的答案是完美的。
ERROR: Microsoft.Azure.ServiceBus.MessageLockLostException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.