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

如何在Azure Durable Functions编排器中获取多活动状态(PowerShell)

问题描述

我用PowerShell开发Azure Durable Functions,现有编排器函数和storage_account活动函数代码如下:

编排器函数

run.ps1

param($Context)
$output = @()
$input="test"
$output1 = Invoke-DurableActivity -FunctionName 'storage_account' -Input $input -nowait
Wait-ActivityFunction -Task $output1
$output1

function.json

{
  "bindings": [
    {
      "name": "Context",
      "type": "orchestrationTrigger",
      "direction": "in"
    }
  ]
}

活动函数(storage_account)

function.json

{
  "bindings": [
    {
      "name": "name",
      "type": "activityTrigger",
      "direction": "in"
    }
  ]
}

run.ps1

param($name)
$rg="test"
$location="westus"
$checkname = (Get-AzStorageAccountNameAvailability $name).NameAvailable

If($checkname -eq "False"){
$name= $name + "date"+(get-date -Format MMdd)+"time"+(get-date -Format hhmm)
}
 "Storage Account $name :inprogress"
$accountstatus = New-AzStorageAccount -Name $name -ResourceGroupName $rg -SkuName Standard_LRS -Location $location 
IF(($accountstatus.ProvisioningState) -eq 'Succeeded'){
    "Storage Account $name :Created"
}

目前只能在所有活动完成后获取结果,需要实时获取每个活动的状态(如创建中、已创建)。尝试用Set-DurableCustomStatus设置自定义状态,但该方法仅保留最后一次设置的状态,之前的会被覆盖。希望实现如下形式的多状态记录:

{
  "customStatus": ["Completed", "Completed", "Started", "Started", "Completed"]
}

已知C#可实现该功能,但未找到PowerShell相关文档,请问是否有办法在statusQueryGetUri或编排器函数内获取活动状态,并实现上述多自定义状态的记录?


解决方案

在PowerShell的Azure Durable Functions中,要实现多状态的自定义状态记录,核心思路是在编排器中维护一个状态数组,每次状态更新时将新状态追加到数组中,再调用Set-DurableCustomStatus更新整个数组,这样就能保留所有历史状态。具体实现步骤如下:

1. 修改活动函数,返回结构化的状态信息

让活动函数输出包含状态标识的结构化对象,方便编排器识别中间状态和最终状态:

param($name)
$rg="test"
$location="westus"
$checkname = (Get-AzStorageAccountNameAvailability $name).NameAvailable

If($checkname -eq "False"){
    $name= $name + "date"+(get-date -Format MMdd)+"time"+(get-date -Format hhmm)
}

# 返回创建中状态
$inProgress = @{
    Message = "Storage Account $name :inprogress"
    Status = "Started"
}
$inProgress

# 执行存储账户创建操作
$accountstatus = New-AzStorageAccount -Name $name -ResourceGroupName $rg -SkuName Standard_LRS -Location $location 

# 返回创建完成状态
If($accountstatus.ProvisioningState -eq 'Succeeded'){
    $completed = @{
        Message = "Storage Account $name :Created"
        Status = "Completed"
    }
    $completed
}

2. 修改编排器函数,维护状态数组并更新自定义状态

在编排器中监听活动函数的多段输出,将每个状态追加到数组后,更新自定义状态:

param($Context)
# 初始化状态数组
$statusHistory = @()
$input="test"

# 异步调用活动函数
$activityTask = Invoke-DurableActivity -FunctionName 'storage_account' -Input $input -NoWait

# 循环监听活动函数的输出片段
while (-not $activityTask.IsCompleted) {
    # 短轮询获取可用输出
    $outputSegments = Wait-ActivityFunction -Task $activityTask -Timeout (New-TimeSpan -Seconds 1) -NoWait
    foreach ($segment in $outputSegments) {
        # 将新状态追加到数组
        $statusHistory += $segment.Status
        # 更新自定义状态,传入完整数组
        Set-DurableCustomStatus -CustomStatus $statusHistory
    }
}

# 处理最终输出并更新最后一次状态
$finalOutput = Wait-ActivityFunction -Task $activityTask
$statusHistory += $finalOutput.Status
Set-DurableCustomStatus -CustomStatus $statusHistory

# 返回最终状态历史
$statusHistory

3. 验证效果

通过statusQueryGetUri查询编排器状态时,customStatus字段会显示所有历史状态的数组,示例如下:

{
  "customStatus": ["Started", "Completed"]
}

关键说明

  • PowerShell的Invoke-DurableActivity配合-NoWait调用后,活动函数的多段输出可通过Wait-ActivityFunction的循环监听获取。
  • 每次调用Set-DurableCustomStatus必须传入完整的状态数组,而非单个状态,以此避免历史状态被覆盖。
  • 若需跟踪多个活动函数的状态,可在编排器中为每个活动维护独立状态项,或统一追加到全局数组中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:50:20