Flowable流程实例并发执行(上)

Flowable流程实例并发执行(上)

这是来自Activiti,Camunda和Flowable用户的一个非常常见的问题:

“我们可以在一个流程实例中同时运行多个活动吗?”

不幸的是,答案是“否”,你可能会感到震惊。

在其6.6.0版本中,Flowable将答案改为是,提供了与新的FutureJavaDelegates功能同时执行实例逻辑的能力。由于这可能是开源BPM领域中非常激动人心的新创新,因此让我们在此博客文章中对其进行深入研究。

背景

首先,讲解流程引擎是如何执行流程实例,流程模型如下:

 

默认情况下,步骤不会同时执行,网关也不行; 尽管下部分支中的步骤不依赖于上部分支中的步骤的执行,但是流程引擎将一次执行每个服务任务。以这种方式构建引擎,以避免在更新基础关系数据库表时产生任何竞争。如果我们同时执行这些步骤,则可能会有冲突的写入。

如果我们通过将所有服务任务的flowable:async属性设置为true来将它们标记为异步的怎么办?由于异步执行器将随后执行任务(活动)实例,因此它们将并行执行吗?默认情况下,答案也没有。异步执行器将确保它一次只执行每个流程实例的一项活动,原因与前面提到的相同。

如果我们还将flowable:exclusive属性设置为false怎么办?在这种情况下,异步执行器将不再在单个流程实例中强制执行作业,这使得并发执行多个步骤成为可能。太好了吧?有一个陷阱...在这种情况下,每个作业都可能试图同时更新同一流程实例。由于这些作业将尝试写入相同的数据库记录,因此非排他的作业将导致出现相当频繁的OptimisticLockingException实例。尽管引擎将它们视为正常执行的一部分,并且通常可以无缝解决,但是以这种方式并发执行实例逻辑通常不会导致更好的整体性能。是的,这些活动可以同时执行,但不一定有效地执行;从Flowable引擎的角度来看,它们可能会有异常。

Activiti,Camunda和6.6.0之前的所有Flowable版本的故事到此结束。换句话说,您要么在单个流程实例中缺乏并发性,要么在异步作业执行中使用并发性并进行权衡取舍。

Flowable的FutureJavaDelegates

flowable6.6.0实现FutureJavaDelegate或它的子类,它使用Java 8的CompletableFuture功能,智能多线程。这是如何工作的,它对流程实例中的并发有真正的帮助吗?

首先,在到目前为止我们讨论的模型中,我们在每个服务任务中都使用了Delegate Expressions,并且使用字段注入来允许记录日志以指示正在执行的任务。例如,在服务任务1-1中,我们将一个传递给分支变量,将一个传递给活动变量。您可以在下面的JavaDelegate实现中看到如何将这些注入的字段用于日志记录:

@Component

public class ExclusivityDelegate implements JavaDelegate {

 

    private final Logger log =

        LoggerFactory.getLogger(ExclusivityDelegate.class);

 

    //For field injection.

    private Expression branch;

    private Expression activity;

 

    @Override

    public void execute(DelegateExecution execution) {

        //Retrieve the injected values. This is executed

        //  exclusively in the process instance.

        String branchStr = (String)branch.getValue(execution);

        String activityStr =

            (String)activity.getValue(execution);

 

        log.info("Executing the \\"execute\\" method for branch "

            + branchStr + " and activity " + activityStr + ".");

 

        execution.setVariable("exclusivityVar_" + branchStr + "_"

            + activityStr, branchStr + "_" + activityStr);

    }

 

}

为了利用FutureJavaDelegates功能,我们将使用一个非常相似的流程模型,如下所示:

 

 

相关教程