activiti:async的作用

来源:互联网 发布:java将string转成map 编辑:程序博客网 时间:2024/06/06 07:23

一、参考 http://www.mossle.com/docs/activiti/#bpmnConcurrencyAndTransactions

有如下说明:

我们可以看到包含用户任务,服务任务和定时器事件的流程。完成用户任务,和校验地址是在同一个工作单元中,所以它们的成功和失败是原子性的。意味着如果服务任务抛出异常,我们要回滚当前事务,这样流程会退回到用户任务,用户任务就依然在数据库里。这就是activiti默认的行为。在(1)中应用或客户端线程完成任务。这会执行服务,流程推进,直到遇到一个等待状态,这里就是定时器(2)。然后它会返回给调用者(3),并提交事务(如果事务是由activiti开启的)。

有的时候,这不是我们想要的。有时我们需要自己控制流程中事务的边界,这样就能把业务逻辑包裹在一起。这就需要使用异步执行了。参考下面的流程(判断):

这次我们完成了用户任务,生成一个发票,把发票发送给客户。这次生成发票不在同一个工作单元内了,所以我们不想对用户任务进行回滚,如果生成发票出错了。所以,我们想让activiti实现的是完成用户任务(1),提交事务,返回给调用者应用。然后在后台的线程中,异步执行生成发票。后台线程就是activiti的job执行器(其实是一个线程池)周期对数据库的job进行扫描。所以后面的场景,当我们到达"generate invoice"任务,我们为activiti创建一个稍后执行的job"消息",并把它保存到数据库。job会被job执行器获取并执行。我们也会给本地job执行器一个提醒,告诉它有一个新job,来增加性能。

要想使用这个特性,我们要使用activiti:async="true"扩展。例子中,服务任务看起来就是这样:

<serviceTask id="service1" name="Generate Invoice" activiti:class="my.custom.Delegate" activiti:async="true" />        

activiti:async可以使用到如下bpmn任务类型中: task, serviceTask, scriptTask, businessRuleTask, sendTask, receiveTask, userTask, subProcess, callActivity

对于userTask,receiveTask和其他等待装填,异步执行的作用是让开始流程监听器运行在一个单独的线程/事务中。


二、实际运行效果

前提条件:执行one job task服务任务时,系统会报一个异常。

1、当one job task 的activiti:async="false" :



2、当one job task 的activiti:async="true" :




0 0
原创粉丝点击