如何在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
相关产品推荐
相关产品推荐

