<?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 Re: Reassigning &amp; Task Complete race problem in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192750#M145880</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I am talking about the&amp;nbsp; sequence of execution is (1),(3),(2) . In that case, after &amp;lt;code&amp;gt;setAssignee //(reassignment by supervisor to another user)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;complete &amp;lt;/code&amp;gt;will be called (by original user) and will execute successfully which should not be the case.. Hope you understand my point and scenario well.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;That's why i suggested using &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 21 Apr 2015 12:10:26 GMT</pubDate>
    <dc:creator>shiva_arunachal</dc:creator>
    <dc:date>2015-04-21T12:10:26Z</dc:date>
    <item>
      <title>Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192741#M145871</link>
      <description>i was doing some study on how to make task reassignment and completion fail proof. i tested explorer in below scenario and it failed.i opened two browers. opened same user task on both browsers. Now did task "reassign" from one browser. and after that task "complete" from another browser. since i re</description>
      <pubDate>Thu, 26 Mar 2015 13:20:47 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192741#M145871</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-03-26T13:20:47Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192742#M145872</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Is there a kind of locking mechanism wherein when a user is working on a task, it will be locked or something like that? As far as i know there is no concept of statuses maintained on tasks. its either completed/uncompleted.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 26 Mar 2015 14:39:35 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192742#M145872</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-03-26T14:39:35Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192743#M145873</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;&amp;gt; Is there a kind of locking mechanism wherein when a user is working on a task,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;No. When the task is assigned, it is supposed to be done by that user. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In your application, you should add a check before doing the&amp;nbsp; complete call. This is not done in Explorer, but could be added easily to your own application.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Mar 2015 08:20:06 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192743#M145873</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2015-03-31T08:20:06Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192744#M145874</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks. As you suggested, i can add a check like below&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;blockcode&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if ( taskService.createTaskQuery().taskAssignee(assignee).taskId(taskId).singleResult() != null )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; taskService.complete(taskId, taskVariables);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/blockcode&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But i will have to put it inside a synchronized block to prevent another thread (supervisor working on another browser) from reassigning after the execution of the "if" statement.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;so i will have to change it as &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;blockcode&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;synchronized(this){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( taskService.createTaskQuery().taskAssignee(assignee).taskId(taskId).singleResult() != null )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; taskService.complete(taskId, taskVariables);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/blockcode&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Similarly i will have to put all the code below run by a supervisor in synchronized block.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;blockcode&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; //delink all tasks linked with this queue id.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; List&amp;lt;Task&amp;gt; tasks = taskService.createTaskQuery().taskCandidateGroup(queueId)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .includeTaskLocalVariables().includeProcessVariables()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .orderByTaskId().desc().list();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; logger.info("total tasks in "+queueId+"is:"+tasks.size());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; for(Task task : tasks){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Update assignee&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String originAssignee = task.getAssignee();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logger.info("originAssignee:"+originAssignee+":created time:"+task.getCreateTime());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; taskService.deleteCandidateGroup(task.getId(), queueId);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // reassign to another user…&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; task.setAssignee("kermit");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/blockcode&amp;gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Using synchronized on these statements, Will this affect the performance ? ?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 31 Mar 2015 12:27:32 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192744#M145874</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-03-31T12:27:32Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192745#M145875</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;You should not have to use synchronized. This won't work on a multi node cluster anyway.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Activiti is designed to cope with this: the taskquery goes to the database and will return null if the task is already fetched by someone else. So you need nothing else and don't need to worry about performance. &lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 07 Apr 2015 12:21:30 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192745#M145875</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2015-04-07T12:21:30Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192746#M145876</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I understand the &amp;lt;code&amp;gt;"taskquery goes to the database and will return null if the task is already fetched by someone else."&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The scenario where i feel it will fail is below:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;User thread:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;=======&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(1)if ( taskService.createTaskQuery().taskAssignee(assignee).taskId(taskId).singleResult() != null )&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; taskService.complete(taskId, taskVariables);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Supervisor thread:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;===========&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//reassign user&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(3)&amp;nbsp;&amp;nbsp; TaskService().setAssignee(task.getId(), selectedUser));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if after execution of (1), (3) executes (they are running indifferent threads,) then (2) executes, then there will be problem.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if sequence of execution is (1),(3),(2) then there will be problem. Hence i have to use synchronised.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Am i wrong in saying to?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Please suggest.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 10 Apr 2015 09:45:09 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192746#M145876</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-04-10T09:45:09Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192747#M145877</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;No, because the setAssignee won't work if the task is already completed, as they are two different database transactions.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 14 Apr 2015 12:23:44 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192747#M145877</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2015-04-14T12:23:44Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192748#M145878</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Joram,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The javadoc for setAssignee only states the below from which i cannot infer what you state. Seems i have to dive deep into code..&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"Changes the assignee of the given task to the given userId. No check is done whether the user is known by the identity component.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;taskId id of the task, cannot be null.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;userId id of the user to use as assignee.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Throws:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ActivitiObjectNotFoundException - when the task or user doesn't exist".&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;From this , i inferred that exception will be thrown only when task/user doesn't exist.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Apr 2015 13:19:39 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192748#M145878</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-04-16T13:19:39Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192749#M145879</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Yes, but you are forgetting all the API methods of the services are 1 transaction. So setAssignee is done in its own transaction. As does the complete method. So one of the two will 'win'.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 21 Apr 2015 08:08:02 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192749#M145879</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2015-04-21T08:08:02Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192750#M145880</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I am talking about the&amp;nbsp; sequence of execution is (1),(3),(2) . In that case, after &amp;lt;code&amp;gt;setAssignee //(reassignment by supervisor to another user)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;complete &amp;lt;/code&amp;gt;will be called (by original user) and will execute successfully which should not be the case.. Hope you understand my point and scenario well.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;That's why i suggested using &amp;lt;code&amp;gt;synchronized&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 21 Apr 2015 12:10:26 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192750#M145880</guid>
      <dc:creator>shiva_arunachal</dc:creator>
      <dc:date>2015-04-21T12:10:26Z</dc:date>
    </item>
    <item>
      <title>Re: Reassigning &amp; Task Complete race problem</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192751#M145881</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hence why i said in the beginning&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;'you should add a check before doing the complete call.'&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You need to make that one transaction in your application. Synchronized is never a good idea, cause it doesn't work in a clustered environment.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 28 Apr 2015 18:06:21 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/reassigning-task-complete-race-problem/m-p/192751#M145881</guid>
      <dc:creator>jbarrez</dc:creator>
      <dc:date>2015-04-28T18:06:21Z</dc:date>
    </item>
  </channel>
</rss>

