Sporadic java.util.ConcurrentModificationException while retrieving tasks.
arif.mohammed May 30, 2014 4:51 PMHello jBPM Team,
I am getting ConcurrentModificationException while retrieving task list and it is not always but sporadic. Following is the complete details about the problem, please let me know if further information is needed.
Envirnoment
- jBPM6 using in embedded mode within spring application.
- snapshot version of 6.1.0
- Session per process instance strategy
- TaskService is a shared object across multiple threads for retrieving tasks from DB, following is the spring configuration. please note that taskService reference is injected as singleton bean and re-used across different threads for retrieving of tasks. Is there any issue in using taskService like this ??
<bean id="runtimeEnvironment" class="org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean"> <property name="type" value="DEFAULT"/> <property name="entityManagerFactory" ref="jbpmEMF"/> <property name="transactionManager" ref="jbpmTxManager"/> <property name="assets"> <map> <entry key-ref="approval-process"><util:constant static-field="org.kie.api.io.ResourceType.BPMN2"/></entry> </map> </property> <property name="taskService" ref="taskService"/> <property name="registerableItemsFactory" ref="rasRegisterableItemsFactory"/> </bean> <bean id="runtimeManager" class="org.kie.spring.factorybeans.RuntimeManagerFactoryBean" destroy-method="close"> <property name="identifier" value="spring-rm"/> <property name="runtimeEnvironment" ref="runtimeEnvironment"/> <property name="type" value="PER_PROCESS_INSTANCE"/> </bean> <bean id="taskService" class="org.kie.spring.factorybeans.TaskServiceFactoryBean" destroy-method="close"> <property name="entityManagerFactory" ref="jbpmEMF"/> <property name="transactionManager" ref="jbpmTxManager"/> <property name="userGroupCallback" ref="userGroupCallback"/> <property name="listeners"> <list> <bean class="com.xyz.myco.TaskLifeCycleEventListener" /> </list> </property> </bean>
And here is the code how tasks are retrieved.
public void getTaskLists(){ ... // taskService is injected by spring InternalTaskService internalService = (InternalTaskService)taskService; List<Status> sts = new ArrayList<Status>(); sts.add(Status.Ready); sts.add(Status.Reserved); sts.add(Status.InProgress); sts.add(Status.Completed); List<TaskSummary> list = internalService.getTasksAssignedAsPotentialOwnerByStatusByGroup(null, groupIds,sts, locale);
And following is the exception snippet while calling getTasksAssignedAsPotentialOwnerByStatusByGroup
java.util.ConcurrentModificationException
java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
java.util.AbstractList$Itr.next(AbstractList.java:343)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:263)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:187)
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:59)
org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1053)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1108)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252)
org.jbpm.services.task.persistence.JPATaskPersistenceContext.queryStringWithParameters(JPATaskPersistenceContext.java:475)
org.jbpm.services.task.persistence.JPATaskPersistenceContext.queryWithParametersInTransaction(JPATaskPersistenceContext.java:344)
org.jbpm.services.task.impl.TaskQueryServiceImpl.getTasksAssignedAsPotentialOwnerByStatusByGroup(TaskQueryServiceImpl.java:263)
org.jbpm.services.task.commands.GetTaskAssignedAsPotentialOwnerCommand.execute(GetTaskAssignedAsPotentialOwnerCommand.java:70)
org.jbpm.services.task.commands.GetTaskAssignedAsPotentialOwnerCommand.execute(GetTaskAssignedAsPotentialOwnerCommand.java:15)
org.jbpm.services.task.commands.TaskCommandExecutorImpl$SelfExecutionCommandService.execute(TaskCommandExecutorImpl.java:65)
org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
org.jbpm.services.task.persistence.TaskTransactionInterceptor.execute(TaskTransactionInterceptor.java:54)
org.jbpm.services.task.commands.TaskCommandExecutorImpl.execute(TaskCommandExecutorImpl.java:40)
org.jbpm.services.task.impl.command.CommandBasedTaskService.getTasksAssignedAsPotentialOwnerByStatusByGroup(CommandBasedTaskService.java:423)
com.xyz.myco.ProcessUtility.getTaskLists(ProcessUtility.java:293)