Мы использовали платформу Activiti версии 5.15, и у нас появляется проблема одновременного изменения при выполнении задания.
также упоминается трассировка стека ошибок
2018-09-19 16:13:46,083 ERROR [org.activiti.engine.impl.jobexecutor.ExecuteJobsRunnable] (pool-4-thread-30) exception during job execution: ProcessInstance[34391064] was updated by another transaction concurrently: org.activiti.engine.ActivitiOptimisticLockingException: ProcessInstance[34391064] was updated by another transaction concurrently
at org.activiti.engine.impl.db.DbSqlSession.flushUpdates(DbSqlSession.java:622)
at org.activiti.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:503)
at org.activiti.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:182)
at org.activiti.engine.impl.interceptor.CommandContext.close(CommandContext.java:128)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:66)
at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:52)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Мы исправили эту проблему с помощью механизма блокировки hazelcastв processInstanceId, потому что он уникален во время выполнения рабочего процесса на дыре.
Мы взяли блокировку Hazelcast, когда транзакция activiti начинает (** в ExecuteJobCommand.java перед job.execute (commandContext); **) для выполнения служебной задачи, Иснять эту блокировку, когда транзакция activiti commit (для служебной задачи) в CommandContext.java после транзакцииContext.commit ();
Используя этот механизм, мы решили проблему (исключение одновременной модификации).
Мне нужнонекоторые предположения, что это создаст какие-либо проблемы в производстве для выполнения работы?и предложить, если у кого-то есть другое решение для решения этой проблемы.