【问题标题】:Azure Function / Azure Service Bus: Manually completing a messageAzure Function / Azure Service Bus:手动完成消息
【发布时间】:2022-08-17 07:17:13
【问题描述】:

我想在成功完成所有活动后将消息标记为完成。在这种情况下,autoCompleteMessageshost.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 所有。您需要一种方法来保存对触发器在您的编排上下文中填充的确切 ServiceBusMessageActionsServiceBusReceivedMessage 的引用——并且您必须在消息锁定过期之前完成整个端到端流程。我没有洞察力来评论如何验证所有活动是否成功,但这可能是更好的途径。
  • 是的,根据我的阅读,完成必须在ServiceBusTrigger 中完成,不能在OrchestrationTrigger 中完成

标签: azure azure-functions azureservicebus


【解决方案1】:

ServiceBusTrigger 中包含的以下内容可以解决问题

string instanceID = Guid.NewGuid();
await starter.StartNewAsync("Hello", instanceID, inputMessage);

var orchestratorStatus = await starter.GetStatusAsync(instanceID);

while (orchestratorStatus.RuntimeStatus == OrchestrationRuntimeStatus.Running || orchestratorStatus.RuntimeStatus == OrchestrationRuntimeStatus.Pending)
{
    await Task.Delay(1000);
    orchestratorStatus = await starter.GetStatusAsync(instanceID);
}

if (orchestratorStatus.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
    logger.LogInformation($"Completed orchestration with ID = '{instanceID}'.");
    await messageActions.CompleteMessageAsync(msg);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 2022-12-27
    • 2020-09-18
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多