1.默认流程实例:假设有以下流程:
以上包含一个用户任务,服务任务,及定时时间流程。由于服务任务是自动执行的,所以完成用户任务和检验地址服务会在同一个事务中,就会导致当校验地址服务出现异常时,事务回滚,用户任务又会回到数据库中(act_run_task).
2.异步执行
有时我们需要自己控制事务边界,这样就可以将业务逻辑包裹在一起,这时就需要异步执行了。如下实例:
以上是包含用户任务,服务任务及接受任务的流程。此处的流程中用户任务在一个事务中,服务任务和接受任务在另一个任务中,故当产生发票出现异常,不会引起用户任务的回滚。这里想要实现的是,让activiti去完成用户任务,提交事务,返回给调用者应用;然后在后台线程中,异步生成发票;生成发票过程由job执行器来监控执行。所以后面的场景,当我们到达“generate invoice”任务,我们为activiti创建一个稍后执行的job消息,并把它保存在数据库中,Job会被job执行器获取并执行。