Проблема с параллельными транзакциями в activit Framework мы исправили, но нам нужна обратная связь - PullRequest
0 голосов
/ 28 декабря 2018

Мы использовали платформу 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 ();

Используя этот механизм, мы решили проблему (исключение одновременной модификации).

Мне нужнонекоторые предположения, что это создаст какие-либо проблемы в производстве для выполнения работы?и предложить, если у кого-то есть другое решение для решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Это нормально видеть, когда работают несколько двигателей Activiti 5 и выполняется асинхронное выполнение.Это является частью проекта исполнителя заданий Activiti 5 - если у вас их несколько, то каждый попытается запустить задание, и первым получит его.Вы можете видеть это как мягкое исключение, так как то, что происходит в проигрышных выполнениях, не будет зафиксировано (если вы не сделаете в этом выполнении пользовательский код, который нельзя откатить, как вызов http).См. https://community.alfresco.com/thread/221722-activitioptimisticlockingexception-on-even-the-simplest-process Самый популярный способ избежать этого, как правило, состоит в том, чтобы отключить исполнитель заданий на всех, кроме одного, механизмах, чтобы только один из них обрабатывал асинхронные задания (по сути, это «лидер»).

0 голосов
/ 28 декабря 2018

Я не знаком с внутренностями Activiti, но распределенные блокировки Hazelcast работают очень хорошо.Я думаю, что главная проблема, с которой вы можете столкнуться, связана с производительностью.Как и в случае любого заблокированного / синхронизированного блока кода, вы сериализуете там свой процесс, который может быть проблемой при увеличении масштаба.Также вам нужно быть очень уверенным, что вы всегда снимаете блокировку, когда процесс покидает блок кода, особенно для исключений.Вы получите тупик, если не сделаете.

...