elsa 变更计划 API

简介

本节描述了变更计划 API 的使用方法,该 API 由 Alterations 模块提供,用于管理变更工作流实例的各种计划,如变量变更、版本迁移及活动调度等。

提交变更计划

要提交一个变更计划,可发送如下 HTTP POST 请求:

POST /alterations/submit HTTP/1.1
Host: localhost:5001

{
    "alterations": [
        {
            "type": "ModifyVariable",
            "variableId": "83fde420b5794bc39a0a7db725405511",
            "value": "你好,世界!"
        },
        {
            "type": "Migrate",
            "targetVersion": 9
        },
        {
            "type": "ScheduleActivity",
            "activityId": "mY1rb4GRjkW3urm8dcNSog"
        }
    ],
    "workflowInstanceIds": [
        "88ce68d00e824c78a53af04f16d276ea"
    ]
}

响应中会包含生成的计划 ID:

{
  "planId": "6cdc459867a94027a6f237417acf398f"
}

查询计划状态

利用上述返回的planId,可以查询计划的状态:

GET /elsa/api/alterations/6cdc459867a94027a6f237417acf398f HTTP/1.1
Host: localhost:5001

响应示例包括计划状态:

{
  "plan": {
    "alterations": [
      // ...省略具体改动详情
    ],
    "workflowInstanceIds": [
      // ...省略实例ID
    ],
    "status": 2,
    "createdAt": "2023-10-04T22:34:31.28188+00:00",
    "completedAt": "2023-10-04T22:34:31.44371+00:00",
    "id": "6cdc459867a94027a6f237417acf398f"
  },
  "jobs": [
    // ...省略作业详情
  ]
}

立即执行的变更

除了异步提交变更计划外,还可以通过 IAlterationRunner 服务立即应用变更。例如:

var alterations = new List<IAlteration>
{
    new ModifyVariable("MyVariable", "MyValue")
};

var workflowInstanceIds = new[] { "26cf02e60d4a4be7b99a8588b7ac3bb9" };
var runner = serviceProvider.GetRequiredService<IAlterationRunner>();
var results = await runner.RunAsync(plan, cancellationToken);

执行后,需要手动调度受影响的工作流实例以继续执行,使用 IAlteredWorkflowDispatcher 服务:

var dispatcher = serviceProvider.GetRequiredService<IAlteredWorkflowDispatcher>();
await dispatcher.DispatchAsync(results, cancellationToken);

这将通知工作流引擎处理已变更的实例并执行它们。

扩展性

Elsa Workflows 支持自定义变更类型,开发者可以定义自己的类型并作为变更使用。

自定义变更类型

实现 IAlteration 接口。

public interface IAlteration
{
}

实现对应的变更处理器IAlterationHandler)。

public interface IAlterationHandler<T> where T : IAlteration
{
    bool CanHandle(IAlteration alteration);
    ValueTask HandleAsync(AlterationHandlerContext context);
}

或者,继承 AlterationHandlerBase<T> 简化实现。

最后,在服务集合中注册自定义的变更处理器。

services.AddElsa(elsa =>
{
    elsa.UseAlterations(alterations =>
    {
        alterations.AddAlteration<MyAlteration, MyAlterationHandler>();
    })
});

这样就完成了自定义变更类型的注册和使用。

示例

以下示例展示了如何定义自定义更改类型和处理程序。

public class MyAlteration : IAlteration
{
    public string Message { get; set; }
}

public class MyAlterationHandler : AlterationHandlerBase<MyAlteration>
{
    public override async ValueTask HandleAsync(AlterationHandlerContext<MyAlteration> context, CancellationToken cancellationToken = default)
    {
        context.WorkflowExecutionContext.Output.Add("Message", context.Alteration.Message);
    }
}
在本文档中