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

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

在该模型中,我们使用了不同的委托实现,在这种情况下,是FutureJavaDelegate的实现,如下所示:

@Component

public class ConcurrencyFutureDelegate implements FutureJavaDelegate> {

 

    private final Logger log =

        LoggerFactory.getLogger(ConcurrencyFutureDelegate.class);

 

    //For field injection.

    private Expression branch;

    private Expression activity;

 

    @Override

    public CompletableFuture>

        execute(DelegateExecution execution,

            AsyncTaskInvoker taskInvoker) {

        //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 + ".");

 

        return taskInvoker.submit(() -> {

            //This occurs in a separate thread (asynchronously).

            log.info("Executing the asynchronous code for branch" 

                + branchStr + " and activity " + activityStr +

                ".");

 

            Map variables = 

                new HashMap();

            variables.put("exclusivityVar_" + branchStr + "_" +    

                activityStr, branchStr + "_" + activityStr);

            return variables;

        });

    }

 

    @Override

    public void afterExecution(DelegateExecution execution,

        Map executionData) {

        //This is executed exclusively in the process instance

        //  *after* completion of the code executed via the

        //  "submit" method call (using the AsyncTaskInvoker) in

        //  the "execute" method above.

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

        String activityStr =

            (String)activity.getValue(execution);

        log.info("Executing the \\"afterExecution\\" method for"

            + " branch " + branchStr + " and activity " +

            activityStr + ".");

 

        for(String key:executionData.keySet()) {

            execution.setVariable(key, executionData.get(key));

        }

    }

}

 

此委托人有一些非常重要的特征,让我们一一介绍一下:

  1. 所述执行方法遗骸,并且它一旦发动机遇到实例中的委托执行。
  2. 通过lambda表达式引用的逻辑与您可以在Callable实现的call()方法中放置的逻辑相同;它会通过一个单独的线程并发执行,同时引擎继续执行其他步骤(即在单独的fork中)。
  3. 在幕后,可流动将保持未来作战的“计划”,它将执行afterExecution只有一次的方法CompletableFuture已经完成(也是意义executionData可用)。

这使我们对流程实例中逻辑的执行方式有很多控制权,而且-在我们看来-它使并发性易于在Flowable流程模型和实例中访问。

根据我们的内部性能测试,尽管与多线程管理相关的表观上和预期上的开销以及等待我们的并发线程完成的需求,但即使确实不需要并发,性能也非常好。因此,当需要并发时,此功能将真正发挥作用。

总结思想

虽然Activiti / Camunda / Flowable系列流程引擎始终表现出色,但到目前为止,对于单个流程实例中的并发性,我们还没有一个好的答案。因此,这是开源BPM世界中非常受欢迎的一项新功能,该功能可以为具有大量并行处理需求的许多客户改变游戏规则。

*-每个分支中的步骤在Camunda BPM中依次执行(服务任务1-1,服务任务1-2,服务任务1-3,服务任务2-1,服务任务2-2,服务任务2-3) ,这些步骤在Flowable(服务任务1-1,服务任务2-1,服务任务1-2,服务任务2-2,服务任务1-3,服务任务2-3)中交错排列。

 

相关教程