Workflow Core项目中的工作流中间件机制详解

Workflow Core项目中的工作流中间件机制详解

workflow-core workflow-core: 一个轻量级的、可嵌入的工作流引擎,针对.NET Standard设计,适用于需要跟踪状态的长期运行过程。 workflow-core 项目地址: https://gitcode.com/gh_mirrors/wo/workflow-core

引言

在现代工作流引擎设计中,中间件机制是实现横切关注点(Cross-Cutting Concerns)的关键技术。Workflow Core项目通过精心设计的中间件系统,为开发者提供了强大的扩展能力,使工作流执行过程具备了高度的灵活性和可定制性。

工作流中间件概述

Workflow Core的中间件系统分为两大类:

  1. 步骤中间件(IWorkflowStepMiddleware):围绕单个工作流步骤执行的中间件
  2. 工作流中间件(IWorkflowMiddleware):在工作流开始前或完成后执行的中间件

这种分层设计类似于ASP.NET Core的中间件管道,但专门为工作流场景进行了优化。

步骤中间件深入解析

步骤中间件允许开发者在工作流步骤执行前后插入自定义逻辑,典型的应用场景包括:

  • 日志关联(Log Correlation)
  • 重试机制(Retry Policies)
  • 性能监控
  • 事务管理
  • 权限验证

核心实现模式

所有步骤中间件都必须实现IWorkflowStepMiddleware接口,其核心方法是HandleAsync。这个方法接收三个关键参数:

  1. IStepExecutionContext:当前步骤的执行上下文
  2. IStepBody:要执行的步骤体
  3. WorkflowStepDelegate:代表下一步操作的委托
public interface IWorkflowStepMiddleware
{
    Task<ExecutionResult> HandleAsync(
        IStepExecutionContext context,
        IStepBody body,
        WorkflowStepDelegate next);
}

典型实现示例

日志关联中间件
public class LogCorrelationStepMiddleware : IWorkflowStepMiddleware
{
    private readonly ILogger _logger;

    public async Task<ExecutionResult> HandleAsync(
        IStepExecutionContext context,
        IStepBody body,
        WorkflowStepDelegate next)
    {
        using (_logger.BeginScope("WorkflowId:{WorkflowId}", context.Workflow.Id))
        using (_logger.BeginScope("StepId:{StepId}", context.Step.Id))
        {
            return await next();
        }
    }
}
基于Polly的重试中间件
public class PollyRetryStepMiddleware : IWorkflowStepMiddleware
{
    public async Task<ExecutionResult> HandleAsync(
        IStepExecutionContext context,
        IStepBody body,
        WorkflowStepDelegate next)
    {
        var retryPolicy = Policy<ExecutionResult>
            .Handle<TimeoutException>()
            .RetryAsync(3, OnRetry);
            
        return await retryPolicy.ExecuteAsync(() => next());
    }

    private void OnRetry(Exception ex, int retryCount)
    {
        // 自定义重试逻辑
    }
}

工作流中间件详解

工作流中间件分为两种执行阶段:

  1. PreWorkflow:工作流开始前执行
  2. PostWorkflow:工作流完成后执行

PreWorkflow中间件

PreWorkflow中间件可以修改工作流实例的属性,常用于:

  • 设置工作流描述
  • 注入环境信息
  • 验证输入参数
  • 初始化跟踪信息
public class DescriptionMiddleware : IWorkflowMiddleware
{
    public WorkflowMiddlewarePhase Phase => 
        WorkflowMiddlewarePhase.PreWorkflow;

    public Task HandleAsync(WorkflowInstance workflow, WorkflowDelegate next)
    {
        if (workflow.Data is IDescriptive data)
        {
            workflow.Description = data.GetDescription();
        }
        return next();
    }
}

PostWorkflow中间件

PostWorkflow中间件适合用于:

  • 发送通知
  • 生成报告
  • 清理资源
  • 记录审计日志
public class AuditMiddleware : IWorkflowMiddleware
{
    public WorkflowMiddlewarePhase Phase => 
        WorkflowMiddlewarePhase.PostWorkflow;

    public Task HandleAsync(WorkflowInstance workflow, WorkflowDelegate next)
    {
        if (workflow.CompleteTime.HasValue)
        {
            LogCompletion(workflow);
        }
        return next();
    }
}

异常处理策略

PreWorkflow异常处理

PreWorkflow中间件的异常会传播到StartWorkflow调用方,需要调用者显式处理:

try 
{
    await workflowHost.StartWorkflow("MyWorkflow");
}
catch (Exception ex)
{
    // 处理初始化异常
}

PostWorkflow异常处理

默认情况下,PostWorkflow中间件的异常会被捕获并记录。可以通过实现IWorkflowMiddlewareErrorHandler自定义处理逻辑:

public class CustomErrorHandler : IWorkflowMiddlewareErrorHandler
{
    public Task HandleAsync(Exception ex)
    {
        // 自定义错误处理
        return Task.CompletedTask;
    }
}

中间件注册与执行顺序

中间件的注册顺序决定了它们的执行顺序。先注册的中间件会先执行(但后完成),这种模式类似于洋葱模型。

services.AddWorkflow()
    .AddWorkflowMiddleware<PreMiddleware1>()
    .AddWorkflowMiddleware<PreMiddleware2>()
    .AddWorkflowStepMiddleware<StepMiddleware1>()
    .AddWorkflowStepMiddleware<StepMiddleware2>();

最佳实践建议

  1. 保持中间件轻量:避免在中间件中执行耗时操作
  2. 明确失败策略:为每个中间件定义清晰的错误处理方式
  3. 合理使用阶段:根据需求选择PreWorkflow或PostWorkflow阶段
  4. 考虑性能影响:评估中间件对工作流执行性能的影响
  5. 编写可测试中间件:确保中间件逻辑易于单元测试

总结

Workflow Core的中间件系统为工作流引擎提供了强大的扩展能力。通过合理使用步骤中间件和工作流中间件,开发者可以实现各种横切关注点,同时保持核心业务逻辑的简洁性。理解中间件的执行顺序和异常处理机制,是构建健壮工作流系统的关键。

workflow-core workflow-core: 一个轻量级的、可嵌入的工作流引擎,针对.NET Standard设计,适用于需要跟踪状态的长期运行过程。 workflow-core 项目地址: https://gitcode.com/gh_mirrors/wo/workflow-core

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙悦彤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值