Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有Servicebus的Azure函数如何不将消息标记为已完成_C#_Azure_Azure Functions_Azureservicebus - Fatal编程技术网

C# 带有Servicebus的Azure函数如何不将消息标记为已完成

C# 带有Servicebus的Azure函数如何不将消息标记为已完成,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,我有一个Azure函数,用于侦听Azure Servicebus队列中的消息。当它接收到消息时,会将它们标记为已完成,并且不再在队列中。 有没有一种方法可以将它们标记为仅当一个长流程完成时?或者,如果失败,则取消标记为完成 我的函数调用Api,我希望在Api返回成功代码之前,不要将消息标记为已完成。函数执行完成后,消息将标记为已完成 中止消息的最简单方法是从函数中抛出异常,例如当API响应错误状态代码时。在这种情况下,消息将被放回队列,并重新尝试该功能(直到为此服务总线队列配置的最大重试次数)。

我有一个Azure函数,用于侦听Azure Servicebus队列中的消息。当它接收到消息时,会将它们标记为已完成,并且不再在队列中。 有没有一种方法可以将它们标记为仅当一个长流程完成时?或者,如果失败,则取消标记为完成


我的函数调用Api,我希望在Api返回成功代码之前,不要将消息标记为已完成。

函数执行完成后,消息将标记为已完成


中止消息的最简单方法是从函数中抛出异常,例如当API响应错误状态代码时。在这种情况下,消息将被放回队列,并重新尝试该功能(直到为此服务总线队列配置的最大重试次数)。

作为接受答案的替代方案,如果您将函数的签名设置为接受代理消息,则您可以手动对消息进行死信处理

[FunctionName("MyFunctionName")]
public async static Task Run([ServiceBusTrigger("myqueue", AccessRights.Manage)]BrokeredMessage brokeredMessage, TraceWriter log) {

    // This will immediately deadletter the message.
    await brokeredMessage.DeadLetterAsync("My reason for deadlettering", "Some description that further explains...");

    return;

}
当它接收到消息时,会将它们标记为已完成,并且不再在队列中

默认情况下,函数运行时实际上不会将消息标记为已完成。正如在接受的答案中所提到的,抛出异常(在您的情况下,如果调用的API返回了一个不利的响应)将放弃消息,并阻止它被标记为完成

为了更好地控制消息何时完成、何时放弃等,您可以使用前面提到的消息类型。这个类直接支持控制消息发生什么情况所需的方法。注意,
BrokeredMessage
应该用于Azure函数版本1.*。如果您使用的是版本2.*,则应将邮件作为类型使用

使用
消息
的一个难点是,与
代理消息
不同,它没有直接的方法让您控制消息何时完成,等等。为了实现这一点,我们可以将参数绑定到函数

为了说明这是如何工作的,这里有一个使用
Message
MessageReceiver
的死字示例:

[FunctionName(“SOExampleFunction”]
公共静态异步任务ProcessMessage(
[ServiceBusTrigger(“myqueue”)]消息消息,
MessageReceiver消息接收者(MessageReceiver)
{
. . .
wait messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
. . .
}
使用此方法时,请确保在host.json中将“autoComplete”服务总线设置设置为false。例如:

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": false
      }
    }
  }
}

来自Microsoft:“函数运行时在PeekLock模式下接收到一条消息。如果函数成功完成,它将调用该消息的Complete,如果函数失败,它将调用放弃。如果函数运行时间超过PeekLock超时,则只要函数运行,锁就会自动续订。”来源:V2。如果引发异常,运行时似乎会重新启动函数主机-这也会影响错误的AppInsights日志。@DavidLapeš是的,我几天前听说过,这非常令人担忧。我希望他们能解决这个问题。这基本上是针对早期版本的service bus trigger。BrokeredMessage现在被称为Message。
MessageReceiver messageReceiver
之前无法注入,因此应使用BrokeredMessage调用
DeadLeterAsync
添加“autoComplete”:false不会产生任何效果-运行时仍将尝试完成消息,即使您手动调用了.complete()这将导致抛出异常,因为一条消息不能完成两次…@radders您可能会遇到此问题最后一条评论帮助解决了我的问题