WorkflowCore提供了几乎针对流行数据库的各种持久化方式,支持SqlServer、Sqlite等关系数据库,也支持MongoDb、Redis等非关系数据库。缺省使用的是在内存中保存流程数据,但在实际应用中,必须将流程数据持久化以保证系统的可靠性。当系统因为计划内或者意外原因出现异常后,正在执行的流程应该能够在断点处恢复并继续执行。我们改造一下第一部分的例子,增加持久化设置,并模拟流程中断和恢复过程。
首先,我们需要使用NuGet引入SqlServer持久化Provider:WorkflowCore.Persistence.SqlServer,当然也可以使用其它类型的数据存储。
然后,修改ConfigureServices,将services.AddWorkflow()修改为:
services.AddWorkflow(x => x.UseSqlServer(@"Server=.;Database=WorkflowCore;Trusted_Connection=True;", true, true));
最后修改一下执行代码,增加流程Id输入和恢复代码:
IServiceProvider serviceProvider = ConfigureServices();
var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<HelloWithNameWorkflowDynamic, Dictionary<string,string>>();
host.Start();
var initialData = new Dictionary<string,string>();
Console.WriteLine("请输入需要恢复的流程编号,如执行新流程直接回车:");
string workflowId = Console.ReadLine();
if (string.IsNullOrEmpty(workflowId))
{
workflowId = host.StartWorkflow("HelloWithNameWorkflowDynamic", 1, initialData).Result;
Console.WriteLine(workflowId);
}
else
{
host.ResumeWorkflow(workflowId);
}
Console.WriteLine("输入名字");
string value = Console.ReadLine();
host.PublishEvent("MyEvent", workflowId, value);
下面,我们模拟中断-恢复过程。首先,运行程序,不输入流程id,直接按回车,会生成新的流程,并输出流程Id,拷贝这个流程ID,并退出程序:
再次执行程序,输入或粘贴上一次生成的流程编号,可以继续执行流程: