ELSA 3.0:使用IWorkflowRuntime调用已注册工作流报错排查
问题描述
我已按照相关文档创建并注册了工作流:
class DailyReport : WorkflowBase { ... } services.AddElsa(elsa => elsa.AddWorkflow<DailyReport>());
使用IWorkflowRuntime启动时,抛出“Specified workflow definition and version does not exist”异常:
var runtime = serviceProvider.GetRequiredService<IWorkflowRuntime>(); var result = await runtime.StartWorkflowAsync("DailyReport");
但使用IWorkflowRunner运行该工作流却正常:
var runner = serviceProvider.GetRequiredService<IWorkflowRunner>(); var result = await runner.RunAsync(new DailyReport());
请问我遗漏了什么配置或步骤?
解决方案
问题核心是IWorkflowRuntime和IWorkflowRunner的运行逻辑差异:
IWorkflowRunner直接运行内存中的工作流实例,不需要依赖持久化存储,所以直接实例化DailyReport就能正常执行。IWorkflowRuntime则依赖已持久化到存储中的工作流定义启动实例,必须先把工作流定义写入数据库(或其他存储介质),才能通过名称/ID找到并启动。
你需要补充以下配置步骤:
启用工作流定义持久化
在注册Elsa服务时,添加存储配置(以EF Core为例):services.AddElsa(elsa => elsa .AddWorkflow<DailyReport>() .AddEntityFrameworkStores<SqliteContext>() // 替换为你的项目数据库上下文 .AddWorkflowDefinitionProvider<StoredWorkflowDefinitionProvider>() );将工作流定义同步到存储
应用启动时,需要把注册的工作流导入到存储中。可以通过IWorkflowDefinitionImporter手动执行:using var scope = serviceProvider.CreateScope(); var importer = scope.ServiceProvider.GetRequiredService<IWorkflowDefinitionImporter>(); await importer.ImportAsync<DailyReport>();或者在注册时开启自动发布(Elsa 3.x支持):
services.AddElsa(elsa => elsa .AddWorkflow<DailyReport>(options => options.Publish = true) // 其他配置项... );确保启动标识匹配
StartWorkflowAsync的参数需要对应工作流定义的名称或ID。建议在工作流类上显式指定名称,避免自动生成的名称不匹配:[Workflow(Name = "DailyReport")] class DailyReport : WorkflowBase { ... }
总结:IWorkflowRuntime依赖持久化的工作流定义,配置好存储并完成定义导入后,就能正常用它启动工作流了。
内容的提问来源于stack exchange,提问作者Hena
相关产品推荐
相关产品推荐

