【发布时间】:2022-08-17 07:17:13
【问题描述】:
我想在成功完成所有活动后将消息标记为完成。在这种情况下,autoCompleteMessages 在host.json 中设置为false。
我可以完成或死信来自ServiceBusTrigger 函数的消息,但我如何确保所有活动都成功?
可以在OrchestrationTrigger函数中完成吗?
FunctionName(\"QueueStart\")]
public static async Task Run(
[ServiceBusTrigger(\"%QueueTopicName%\", \"Subscription\", Connection = \"ServiceBusConnectionString\")]
ServiceBusReceivedMessage msg,
ServiceBusMessageActions messageActions,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
string inputMessage = Encoding.UTF8.GetString(msg.Body);
await starter.StartNewAsync(\"Hello\", null, inputMessage);
// can run here, but how to check if all activities succeeded?
// await messageActions.CompleteMessageAsync(msg);
// await messageActions.DeadLetterMessageAsync(msg);
}
[FunctionName(\"Hello\")]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
var outputs = new List<string>();
outputs.Add(await context.CallActivityAsync<string>(\"Hello_Hello\", \"London\"));
outputs.Add(await context.CallActivityAsync<string>(\"Hello_Hello1\", \"Seattle\"));
// how to mark message as complete here?
return outputs;
}
[FunctionName(\"Hello_Hello\")]
public static string SayHello([ActivityTrigger] string name, ILogger log)
{
log.LogInformation($\"Saying hello to {name}.\");
return $\"Hello {name}!\";
}
[FunctionName(\"Hello_Hello1\")]
public static string SayHello1([ActivityTrigger] string city, ILogger log)
{
throw new Exception(\"Exception from hello1\");
log.LogInformation($\"Saying hello1 to {city}.\");
return $\"Hello {city}!\";
}
-
消息完成必须在接收消息的同一 AMQP 链接上执行。在这种情况下,该连接和链接归
ServiceBusTrigger所有。您需要一种方法来保存对触发器在您的编排上下文中填充的确切ServiceBusMessageActions和ServiceBusReceivedMessage的引用——并且您必须在消息锁定过期之前完成整个端到端流程。我没有洞察力来评论如何验证所有活动是否成功,但这可能是更好的途径。 -
是的,根据我的阅读,完成必须在
ServiceBusTrigger中完成,不能在OrchestrationTrigger中完成
标签: azure azure-functions azureservicebus