处理的bug,在工作流引擎中,如果同时开启多条线程对同一个环节进行状态更新,若存在线程正在更新,其他访问的线程就会返回一个ActivitiOptimisticLockingException 异常 :
(toString(updatedObject)+" was updated by another transaction concurrently");
经过一些资料查询,问题发生的原理是在serviceTask完成后,更新的ExecutionEntity 是同一条记录,而每一个serviceTask 此时处于
两个不同的线程和事务当中,两个事务彼此不可见,任务开始时获取的ExecutionEntity完成相同,当一个事务成功更新后,
另一个事务就会失败。这样保证了流程的准确执行,当该任务失败后,会在下一个JobExecutor 扫描时重新执行。此时获取的
execution 的版本已经加1,此时任务正常结束。
处理并发问题牵涉到多线程管理。我的处理方式是对前一线程进行xx.join();保证前一线程结束后才开始下一组的线程处理,避免并发情况的发生
网友评论