WorkflowCore的默认持久化实现 - MemoryPersistenceProvider
IPersistenceProvider : IWorkflowRepository, ISubscriptionRepository, IEventRepository
IPersistenceProvider接口
Task PersistErrors(IEnumerable<ExecutionError> errors);
void EnsureStoreExists();
IWorkflowRepository接口
Task<string> CreateNewWorkflow(WorkflowInstance workflow);
Task PersistWorkflow(WorkflowInstance workflow);
Task<IEnumerable<string>> GetRunnableInstances(DateTime asAt);
Task<WorkflowInstance> GetWorkflowInstance(string Id);
Task<IEnumerable<WorkflowInstance>> GetWorkflowInstances(IEnumerable<string> ids);
IEventRepository接口
Task<string> CreateEvent(Event newEvent);
Task<Event> GetEvent(string id);
Task<IEnumerable<string>> GetRunnableEvents(DateTime asAt);
Task<IEnumerable<string>> GetEvents(string eventName, string eventKey, DateTime asOf);
Task MarkEventProcessed(string id);
Task MarkEventUnprocessed(string id);
IPersistenceProvider的默认实现 - 本地内存
public class MemoryPersistenceProvider : ISingletonMemoryProvider
{
private readonly List<WorkflowInstance> _instances = new List<WorkflowInstance>();
private readonly List<EventSubscription> _subscriptions = new List<EventSubscription>();
private readonly List<Event> _events = new List<Event>();
private readonly List<ExecutionError> _errors = new List<ExecutionError>();
// ... ...
}
[ 注意 ] 源码中的摘要:
In-memory implementation of IPersistenceProvider for demo and testing purposes
用于demo和testing,也就是WorkflowCore在实际应用中,要按需配置 IPersistenceProvider的实现。
默认为 MemoryPersistenceProvider
,使用单例内存的方式。注意 _instances
使用了List且只有Add没有Remove,每次执行 StartWorkflow
都会增加 _instances
的内存占用。Workflow执行完后不会主动释放Workflow实例,如果介意内存占用量的话,要自己手动去释放或者使用其它的IPersistenceProvider实现。例如:
- WorkflowCore.Persistence.EntityFramework
(Mysql,Postgres,SqlServer,Sqlite) - WorkflowCore.Persistence.MongoDB
- WorkflowCore.Persistence.RavenDB
- WorkflowCore.Providers.AWS
- WorkflowCore.Providers.Redis
- WorkflowCore.Providers.Elasticsearch
以上在 WorkflowOptions
中使用UseMySQL、UseRavenDB、UsePostgreSQL、UseOracle、UseSqlServer或UseSqlite 配置后,即相应的配置了 IPersistenceProvider的实现。
由于工作流程通常是长时间运行的流程,因此需要在步骤之间将它们持久保存到存储中。