You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Durable Functions中如何跟踪Activity Trigger的执行进度与输出

如何在Durable Functions编排运行时跟踪已完成的Activity输出?

我正在使用Durable Functions构建编排器服务,核心代码如下:

public static class Flow
{
    [FunctionName(nameof(Flow))]
    public static async Task<List<string>> FlowRunOrchestrator(
        [OrchestrationTrigger]
        IDurableOrchestrationContext context)
    {
        var outputs = new List<string>();

        // 串行调用Activity
        outputs.Add(await context.CallActivityAsync<string>(
            nameof(FlowSayHello), "Tokyo"));

        outputs.Add(await context.CallActivityAsync<string>(
            nameof(FlowSayHello), "Seattle"));

        outputs.Add(await context.CallActivityAsync<string>(nameof(
            FlowSayHello), "London"));

        return outputs;
    }

    [FunctionName(nameof(FlowSayHello))]
    public static async Task<string> FlowSayHello(
        [ActivityTrigger]
        string name,
        ILogger log)
    {
        await Task.Delay(10000);
        log.LogDebug($"Saying hello to {name}.");
        return $"Hello {name}!";
    }

    [FunctionName(nameof(FlowHttpStart))]
    public static async Task<HttpResponseMessage> FlowHttpStart(
        [HttpTrigger(
            AuthorizationLevel.Anonymous,
            "get",
            Route = "02")]
        HttpRequestMessage req,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        string instanceId = await starter.StartNewAsync(nameof(Flow), null);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

目前的问题是:每次Activity执行完成后,虽然编排器内的outputs列表已更新,但调用状态查询URI时,仅能看到整个编排的运行状态,无法获取已完成Activity的输出。例如,当Tokyo对应的Activity完成后,状态响应的output字段仍为null:

{
    "name": "Flow",
    "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087",
    "runtimeStatus": "Running",
    "input": null,
    "customStatus": null,
    "output": null,
    "createdTime": "2022-07-12T14:54:22Z",
    "lastUpdatedTime": "2022-07-12T14:54:32Z"
}

只有当所有Activity全部执行完成后,output字段才会返回完整的输出列表:

{
    "name": "Flow",
    "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087",
    "runtimeStatus": "Completed",
    "input": null,
    "customStatus": null,
    "output": [
        "Hello Tokyo!",
        "Hello Seattle!",
        "Hello London!"
    ],
    "createdTime": "2022-07-12T14:54:22Z",
    "lastUpdatedTime": "2022-07-12T14:54:53Z"
}

希望能在每个Activity完成时,通过状态URI获取已完成的输出内容,该如何实现?


解决方案:利用Durable Functions的Custom Status功能

Durable Functions提供的SetCustomStatus方法,允许编排器在运行时主动更新自定义状态信息,状态查询API会返回这个customStatus字段,正好用来传递中间的Activity输出。

  • 修改编排器代码,添加自定义状态更新
    在每个Activity执行完成后,调用context.SetCustomStatus(outputs),将当前已完成的输出列表同步到自定义状态中:
[FunctionName(nameof(Flow))]
public static async Task<List<string>> FlowRunOrchestrator(
    [OrchestrationTrigger]
    IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    // 执行Tokyo的Activity并更新状态
    var tokyoOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "Tokyo");
    outputs.Add(tokyoOutput);
    context.SetCustomStatus(outputs); // 更新自定义状态

    // 执行Seattle的Activity并更新状态
    var seattleOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "Seattle");
    outputs.Add(seattleOutput);
    context.SetCustomStatus(outputs); // 更新自定义状态

    // 执行London的Activity并更新状态
    var londonOutput = await context.CallActivityAsync<string>(nameof(FlowSayHello), "London");
    outputs.Add(londonOutput);
    context.SetCustomStatus(outputs); // 更新自定义状态

    return outputs;
}
  • 查看更新后的状态响应
    当Tokyo的Activity完成后,状态查询API会返回包含已完成输出的customStatus字段:
{
    "name": "Flow",
    "instanceId": "dd8ed17a7fc4446fb9ee5e5087e53087",
    "runtimeStatus": "Running",
    "input": null,
    "customStatus": ["Hello Tokyo!"],
    "output": null,
    "createdTime": "2022-07-12T14:54:22Z",
    "lastUpdatedTime": "2022-07-12T14:54:32Z"
}

当Seattle的Activity完成后,customStatus会更新为:

"customStatus": ["Hello Tokyo!", "Hello Seattle!"]

所有Activity完成后,output字段会返回完整列表,同时customStatus也会包含相同的内容。


内容的提问来源于stack exchange,提问作者Sandeep Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:24:20