WorkflowCore
一、快速开始
1、添加类库
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.0" />
<PackageReference Include="WorkflowCore" Version="3.11.0" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
2、添加Workflow
var services = new ServiceCollection();
services.AddLogging(c =>
{
c.SetMinimumLevel(LogLevel.Debug);
c.AddDebug();
});
services.AddWorkflow();
var sp = services.BuildServiceProvider();
Ioc.Default.ConfigureServices(sp);
3、注册工作流
var host = sp.GetRequiredService<IWorkflowHost>();
host.RegisterWorkflow<HelloworldWorkflow, HelloParam>();
host.OnLifeCycleEvent += Host_OnLifeCycleEvent;
# 启动
host.Start();
# 停止
private void Host_OnLifeCycleEvent(LifeCycleEvent evt)
{
}
4、定义工作流
internal class HelloworldWorkflow : IWorkflow<HelloParam>
{
public string Id => "HelloworldWorkflow";
public int Version => 1;
public void Build(IWorkflowBuilder<HelloParam> builder)
{
builder
.StartWith<HelloStepBody>()
.Then<WorldStepBodyAsync >();
}
}
5、定义步骤
internal class HelloStepBody : StepBody
{
public override ExecutionResult Run(IStepExecutionContext context)
{
Debug.WriteLine("Hello");
return ExecutionResult.Next();
}
}
internal class WorldStepBodyAsync : StepBodyAsync
{
public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
{
Debug.WriteLine("World!");
await Task.Delay(10);
return ExecutionResult.Next();
}
}
6、执行工作流
using var scope = Ioc.Default.CreateScope();
var host = scope.ServiceProvider.GetRequiredService<IWorkflowHost>();
host.StartWorkflow<HelloParam>("HelloworldWorkflow", new HelloParam { });
二、WorkflowController 工作流控制器
# 启动工作流
Task<string> StartWorkflow(...);
# 发布事件
Task PublishEvent(string eventName, string eventKey, object eventData, DateTime? effectiveDate = null);
# 注册工作流
void RegisterWorkflow<TWorkflow>()
void RegisterWorkflow<TWorkflow, TData>()
# 暂停工作流,直到调用 ResumeWorkflow
Task<bool> SuspendWorkflow(string workflowId);
# 恢复工作流
Task<bool> ResumeWorkflow(string workflowId);
# 终止工作流
Task<bool> TerminateWorkflow(string workflowId);
三、ActivityController 活动控制器
# [学习] 源码生成的Token字符串的方法
public string Token { get; set; }
public string ActivityName { get; set; }
public object Parameters { get; set; }
# 使用 GetPendingActivity 返回时,默认为DateTime.MaxValue
public DateTime TokenExpiry { get; set; }
# 获取待处理的活动
Task<PendingActivity> GetPendingActivity(string activityName, string workerId, TimeSpan? timeout = null);
# 释放活动
Task ReleaseActivityToken(string token);
# 提交成功的结果
Task SubmitActivitySuccess(string token, object result);
# 提交失败的结果
Task SubmitActivityFailure(string token, object result);
一个活动的Step by Step
builder
.StartWith<HelloStepBody>()
# Step2. 等待活动
.Activity("activity1",(data)=>data.Param1)
.Output(data=>data.Param1, step=>step.Result)
# Step5. 活动结果后继续执行
.Then<WorldStepBody>();
using var scope = Ioc.Default.CreateScope();
var host = scope.ServiceProvider.GetRequiredService<IWorkflowHost>();
# Step1. 启动工作流
var workflowId = await host.StartWorkflow<HelloParam>("HelloworldWorkflow", new HelloParam { });
await Task.Run(async () =>
{
await Task.Delay(3000);
# Step3. 获取活动
var activity = await host.GetPendingActivity("activity1", workflowId);
if (activity != null)
{
Debug.WriteLine("Parameters: " + activity.Parameters);
# Step4. 提交活动结果
await host.SubmitActivitySuccess(activity.Token, "World");
}
});