如何解决Elsa 2.0 为什么这个工作流执行一个分支的两个分支,而我只期望一个分支?
Elsa 正在执行工作流的两个分支,而我只期待一个,A 或 B。这是控制台应用程序的文件。
为了您的方便,我已经推送了 same here as well。
class Program
{
static async Task Main(string[] args)
{
var services = new ServiceCollection()
.AddElsa(options => options
.AddConsoleActivities()
.AddActivity<ForkBranchDecisionActivity>()
.AddWorkflow<SimpleForkWorkflow>())
.BuildServiceProvider();
var workflowStarter = services.GetrequiredService<IBuildsAndStartsWorkflow>();
await workflowStarter.BuildAndStartWorkflowAsync<SimpleForkWorkflow>();
Console.WriteLine("Done. Good bye");
}
}
当我输入“A”时,结果将是“A”,否则将是“B”。
public class ForkBranchDecisionActivity : Activity
{
protected override IActivityExecutionResult OnExecute()
{
Console.WriteLine("Choose a branch. A or B");
Console.WriteLine("Typing a will resulting in going through branch A");
Console.WriteLine("Any other key will result in branch B");
var userChoosenBranch = Console.ReadLine();
if (userChoosenBranch!.toupper() == "A")
return Outcome("A");
return Outcome("B");
}
}
选择的分支不是基于上一个活动的结果吗?如果不是,那么是什么决定了要执行的分支?在我的情况下,为什么两个分支都被执行?
public class SimpleForkWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder
.WriteLine("This demonistrates a simple workflow with fork .")
.WriteLine("Using forks we can branch a workflow.")
.Then<ForkBranchDecisionActivity>()
.Then<Fork>(
fork => fork.WithBranches("A","B"),fork =>
{
var aBranch = fork
.When("A")
.WriteLine("You are in A branch. First line")
.WriteLine("You are in A branch. Second line.")
.ThenNamed("AfterJoin");
var bBranch = fork
.When("B")
.WriteLine("You are in B branch. First line")
.WriteLine("You are in B branch. Second line.")
.ThenNamed("AfterJoin");
})
.WithName("AB Fork")
.Add<Join>(x => x.WithMode(Join.JoinMode.WaitAny)).WithName("AfterJoin")
.WriteLine("Workflow finished.");
}
}
我的最终控制台输出如下所示。
This demonistrates a simple workflow with fork .
Using forks we can branch a workflow.
Choose a branch. A or B
Typing a will resulting in going through branch A
Any other key will result in branch B
a
You are in B branch. First line
You are in B branch. Second line.
Workflow finished.
You are in A branch. First line
You are in A branch. Second line.
Workflow finished.
Done. Good bye
更新
谢谢@Sipke Schoorstra。乍一看并不明显。所以在这里强调变化。
代替
.Then<ForkBranchDecisionActivity>()
.Then<Fork>(
应该是
.Then<ForkBranchDecisionActivity>(fork =>
{
fork.When("A")
注意 Fork 活动已完全删除,不再是工作流的一部分。
解决方法
这是设计使然:Fork
活动将安排所有分支。这是一种将工作流执行拆分为多个分支的方法。
这允许你做一些事情,比如在一个分支中等待一些用户输入,但在某个超时事件之后继续另一个分支。这种情况的一个很好的例子是 described here。
要实施您的工作流程,您只需要:
public class SimpleForkWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder
.WriteLine("This demonstrates a simple workflow with switch.")
.WriteLine("Using switch we can branch a workflow.")
.Then<ForkBranchDecisionActivity>(fork =>
{
fork.When("A")
.WriteLine("You are in A branch. First line")
.WriteLine("You are in A branch. Second line.")
.ThenNamed("Finish");
fork.When("B")
.WriteLine("You are in B branch. First line")
.WriteLine("You are in B branch. Second line.")
.ThenNamed("Finish");
})
.WriteLine("Workflow finished.").WithName("Finish");
}
}
请注意,Then<ForkBranchDecisionActivity>
调用接受一个参数,该参数允许您将任意结果连接到您的活动(在您的情况下为“A”和“B”)。
运行此工作流时,结果将如预期:
This demonstrates a simple workflow with switch.
Using switch we can branch a workflow.
Choose a branch. A or B
Typing 'a' will result in going through branch A
Any other key will result in branch B
a
You are in A branch. First line
You are in A branch. Second line.
Workflow finished.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。