activiti 异步和事务

本文详细介绍了Activiti流程引擎中的异步执行和事务处理。在默认情况下,服务任务与用户任务在同一事务中,可能导致异常时事务回滚。通过异步执行,可以控制事务边界,使得业务逻辑独立,例如在用户任务完成后异步生成发票。Activiti的异步任务可以通过`activiti:async="true"`属性实现,并且在用户任务和接收任务中,异步执行能让监听器在单独线程中运行。此外,从5.9版本开始,Activiti支持排他任务,确保同一流程实例的Job按顺序执行,避免并发问题。文章最后总结了排他job与非排他job的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.默认流程实例:假设有以下流程:
       以上包含一个用户任务,服务任务,及定时时间流程。由于服务任务是自动执行的,所以完成用户任务和检验地址服务会在同一个事务中,就会导致当校验地址服务出现异常时,事务回滚,用户任务又会回到数据库中(act_run_task).

2.异步执行
    有时我们需要自己控制事务边界,这样就可以将业务逻辑包裹在一起,这时就需要异步执行了。如下实例:
       以上是包含用户任务,服务任务及接受任务的流程。此处的流程中用户任务在一个事务中,服务任务和接受任务在另一个任务中,故当产生发票出现异常,不会引起用户任务的回滚。这里想要实现的是,让activiti去完成用户任务,提交事务,返回给调用者应用;然后在后台线程中,异步生成发票;生成发票过程由job执行器来监控执行。所以后面的场景,当我们到达“generate invoice”任务,我们为activiti创建一个稍后执行的job消息,并把它保存在数据库中,Job会被job执行器获取并执行。
     使用异步执行时,需要使用activiti:asyn="true"扩展,如下:
    <serviceTask id="service1" name="Generate Invoice" activiti:class="my.custom.Delegate" activiti:async="true" />
 activiti:async can be specified on the following BPMN task types: task, serviceTask, scriptTask, businessRuleTask,         sendTask, receiveTask, userTask, subProcess, callActivity
On a userTask, receiveTask or other wait states, the async continuation allows us to execute the start execution listeners in a separate thread/transaction.(对于userTAsk,recieveTask及需要存在等待状态的任务,异步是让执行监听器在一个线程或事务中执行)


3.排他任务
    从activiti5.9开始,JobExcutor能保证同一个流程实例中的Job不会并发执行。activiti默认就是排他任务。因为JobExecutor会保证在任何时候获取一个流程实例的排他任务时,都会将同一流程实例的其他排他任务都取出来,放在同一个工作线程中顺序执行。
      以上包含一个并行网关和三个异步执行的服务任务。这样会添加三个job到数据库中,他就可以被jobExecutor执行了。
       由于三个服务任务都是异步的,故可能出现三个job被jobExecute同时获取执行,最终导致三个提交事务同时汇聚时重叠,又由于事务是互相不可见的,所以他们都在等待其他分支任务,无法继续执行。
     排他JOb:可以通过activiti:exclusive="true"设置排他任务。


异步执行总结:
    a. 排他job和非排他job的区别:前者即JobExecutor会保证在任何时候获取一个流程实例的排他任务时,都会将同一流程实例的其他排他任务都取出来,放在同一个工作线程中顺序执行。 后者即JobExecutor会把job放到线程池中来执行,会出现每job会被分配给一个线程来执行,出现线程并发。
   b.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值