<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic User tasks completed concurrently in different threads in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109140#M76590</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I am using Activiti 5.9.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I tried running a process with parallel gateway and two user tasks an each path.&amp;nbsp;&amp;nbsp; One of the user tasks is a non-sequential multi-instance.&amp;nbsp; Then I complete each of the user tasks in a separate thread.&amp;nbsp; Occasionally, I am getting the ActivitiOptimisticLockingException when calling TaskService.complete(taskId).&amp;nbsp; Is this expected behavior or a bug?&amp;nbsp; Does this mean one should not use the parallel gateway for user tasks because it is totally possible for two different users to complete these user tasks at the same time? Thank you for your time.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This is the process definition.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;&amp;lt;process id="testUserTask" name="Test User Task"&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;startEvent id="startevent1" name="Start"&amp;gt;&amp;lt;/startEvent&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parallelGateway id="parallelgateway1" name="Parallel Gateway"&amp;gt;&amp;lt;/parallelGateway&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;userTask id="usertask1" name="User Task 1" activiti:async="true" activiti:candidateUsers="rocket"&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;multiInstanceLoopCharacteristics isSequential="false"&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;loopCardinality&amp;gt;3&amp;lt;/loopCardinality&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/multiInstanceLoopCharacteristics&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/userTask&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;userTask id="usertask2" name="User Task 2" activiti:async="true" activiti:candidateUsers="rocket"&amp;gt;&amp;lt;/userTask&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parallelGateway id="parallelgateway2" name="Parallel Gateway"&amp;gt;&amp;lt;/parallelGateway&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scriptTask id="scripttask1" name="Script Task" activiti:async="true" scriptFormat="groovy"&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script&amp;gt;&amp;lt;![CDATA[sleep(4000)]]&amp;gt;&amp;lt;/script&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/scriptTask&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endEvent id="endevent1" name="End"&amp;gt;&amp;lt;/endEvent&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="parallelgateway1"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow2" name="" sourceRef="parallelgateway1" targetRef="usertask1"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow3" name="" sourceRef="parallelgateway1" targetRef="usertask2"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow4" name="" sourceRef="usertask1" targetRef="parallelgateway2"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow5" name="" sourceRef="usertask2" targetRef="parallelgateway2"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow6" name="" sourceRef="parallelgateway2" targetRef="scripttask1"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequenceFlow id="flow7" name="" sourceRef="scripttask1" targetRef="endevent1"&amp;gt;&amp;lt;/sequenceFlow&amp;gt;&lt;BR /&gt;&amp;nbsp; &amp;lt;/process&amp;gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;This is the exception stack trace.&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;org.activiti.engine.ActivitiOptimisticLockingException: VariableInstanceEntity[3716] was updated by another transaction concurrently&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.db.DbSqlSession.flushUpdates(DbSqlSession.java:452)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:348)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:149)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.interceptor.CommandContext.close(CommandContext.java:105)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:49)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at org.activiti.engine.impl.TaskServiceImpl.complete(TaskServiceImpl.java:144)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at test.base.HomeFactory.completeTask(HomeFactory.java:52)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at test.base.MyWorkerThread.run(MyWorkerThread.java:31)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;at java.lang.Thread.run(Thread.java:662)&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 18 Apr 2012 00:50:42 GMT</pubDate>
    <dc:creator>jellybean</dc:creator>
    <dc:date>2012-04-18T00:50:42Z</dc:date>
    <item>
      <title>User tasks completed concurrently in different threads</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109140#M76590</link>
      <description>I am using Activiti 5.9.I tried running a process with parallel gateway and two user tasks an each path.&amp;nbsp;&amp;nbsp; One of the user tasks is a non-sequential multi-instance.&amp;nbsp; Then I complete each of the user tasks in a separate thread.&amp;nbsp; Occasionally, I am getting the ActivitiOptimisticLockingException when c</description>
      <pubDate>Wed, 18 Apr 2012 00:50:42 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109140#M76590</guid>
      <dc:creator>jellybean</dc:creator>
      <dc:date>2012-04-18T00:50:42Z</dc:date>
    </item>
    <item>
      <title>Re: User tasks completed concurrently in different threads</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109141#M76591</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;This behaviour can occur, is expected and not a bug. Just complete the second task again and it will succeed. No need to skip using this gateway…&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 18 Apr 2012 05:29:50 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109141#M76591</guid>
      <dc:creator>ronald_van_kuij</dc:creator>
      <dc:date>2012-04-18T05:29:50Z</dc:date>
    </item>
    <item>
      <title>Re: User tasks completed concurrently in different threads</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109142#M76592</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you. This really helps. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The solution to retry completing the user tasks make me wonder why can't a similar approach be implemented in Activiti when trying to join (parallel gateway) non-exclusive service tasks running concurrently. I created a similar process where there are 3 async service tasks with "exclusive=false" following a parallel gateway.&amp;nbsp; As expected, I got the Optimistic Locking Exception.&amp;nbsp; Going forward, is Activiti going to build into the engine the retry mechanism at the join of the parallel gateway in a way that it only retry the transition, but not the entire transaction?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 18 Apr 2012 16:24:24 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/user-tasks-completed-concurrently-in-different-threads/m-p/109142#M76592</guid>
      <dc:creator>jellybean</dc:creator>
      <dc:date>2012-04-18T16:24:24Z</dc:date>
    </item>
  </channel>
</rss>

