微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Elsa 2.0 为什么这个工作流执行一个分支的两个分支,而我只期望一个分支?

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?