.NET 8独立进程下如何检查BuildingsOrchestration编排函数是否运行
.NET 8独立进程模式下检查Durable Orchestration运行状态的方法
原触发函数代码
[Function(nameof(FunctionNames.BuildingsStart))] public static async Task<HttpResponseData> HttpRun( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, [DurableClient] DurableTaskClient client, FunctionContext executionContext) { ILogger logger = executionContext.GetLogger(nameof(HttpRun)); string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(FunctionNames.BuildingsOrchestration)); logger.LogInformation("Created new orchestration with instance ID = {instanceId}", instanceId); return client.CreateCheckStatusResponse(req, instanceId); }
问题
在.NET 8独立进程(非进程内)模式下,如何检查BuildingsOrchestration编排函数是否已处于运行状态或正在执行过程中?
解决方案
在.NET 8独立进程模式下,依然可以通过DurableTaskClient提供的API查询编排实例状态,核心是获取实例的运行状态枚举值,判断是否属于运行中/执行过程的范畴。
具体实现步骤
- 在函数中注入
DurableTaskClient(与原触发函数的注入方式一致) - 调用
GetInstanceAsync方法获取指定实例的状态信息 - 根据
OrchestrationRuntimeStatus枚举值判断实例是否处于运行状态
示例代码
[Function(nameof(CheckBuildingOrchestrationStatus))] public static async Task<HttpResponseData> CheckBuildingOrchestrationStatus( [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req, [DurableClient] DurableTaskClient client, FunctionContext executionContext) { var logger = executionContext.GetLogger(nameof(CheckBuildingOrchestrationStatus)); // 从请求查询参数中获取要检查的实例ID if (!req.Query.TryGetValues("instanceId", out var instanceIdValues) || string.IsNullOrWhiteSpace(instanceIdValues.First())) { var badRequest = req.CreateResponse(HttpStatusCode.BadRequest); await badRequest.WriteStringAsync("请提供有效的instanceId查询参数"); return badRequest; } string targetInstanceId = instanceIdValues.First(); try { var instance = await client.GetInstanceAsync(targetInstanceId); // 判定运行中/执行过程中的状态:Running(正在运行)、Pending(等待执行)、ContinuedAsNew(重启执行) bool isInExecution = instance.Status is OrchestrationRuntimeStatus.Running or OrchestrationRuntimeStatus.Pending or OrchestrationRuntimeStatus.ContinuedAsNew; var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync(new { InstanceId = targetInstanceId, CurrentStatus = instance.Status.ToString(), IsInExecution = isInExecution }); return response; } catch (OrchestrationInstanceNotFoundException) { var notFoundResp = req.CreateResponse(HttpStatusCode.NotFound); await notFoundResp.WriteStringAsync($"实例ID {targetInstanceId} 不存在"); return notFoundResp; } }
关键说明
DurableTaskClient.GetInstanceAsync:用于获取指定ID的编排实例详情,包含状态信息OrchestrationRuntimeStatus枚举:定义了编排实例的所有可能状态,其中Running、Pending、ContinuedAsNew属于执行过程中的状态- 异常处理:当实例ID不存在时会抛出
OrchestrationInstanceNotFoundException,需要捕获并返回对应响应
内容的提问来源于stack exchange,提问作者thefunctionofnoreturn
相关产品推荐
相关产品推荐

