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