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);
}
}