<?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 5.9 and exclusive jobs in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99244#M68565</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Just wanted to share this observation, maybe other people have the same opinion. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The doc says about exclusive jobs:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;It is actually not a performance issue. Performance is an issue under heavy load. Heavy load means that all worker threads of the job executor are busy all the time.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt;I wanted to get a feeling for the impact of this and created a small test case (see attached picture). Just imagine that the actual process is much larger than that but all non-service tasks have been stripped from the process flow for the sake of clearness.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;[attachment=0]exclusivejobs.jpg[/attachment]&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;All tasks are defined as &amp;lt;serviceTask id="servicetaskX" name="Service Task" activiti:delegateExpression="${theServiceTask}" activiti:async="true" /&amp;gt; and the JavaDelegate implementation is just this&lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;&lt;BR /&gt;@Component("theServiceTask")&lt;BR /&gt;public class ServiceTask implements JavaDelegate {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private AtomicInteger order = new AtomicInteger(0);&lt;BR /&gt;&lt;BR /&gt;@Override&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void execute(DelegateExecution execution) throws Exception {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order.getAndIncrement();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sleeptimeMilliseconds = new Random().nextInt(5) * 1000;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long id = Thread.currentThread().getId();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(order.get() + " - thread " + id + " sleeping " + sleeptimeMilliseconds + " ms");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(sleeptimeMilliseconds);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(order.get() + " - thread " + id + " finished");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;}&lt;BR /&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;/CODE&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;When i start this process i get this output, totally expected&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;&lt;BR /&gt;1 - thread 20 sleeping 3000 ms&lt;BR /&gt;1 - thread 20 finished&lt;BR /&gt;2 - thread 20 sleeping 3000 ms&lt;BR /&gt;2 - thread 20 finished&lt;BR /&gt;3 - thread 20 sleeping 3000 ms&lt;BR /&gt;3 - thread 20 finished&lt;BR /&gt;4 - thread 20 sleeping 1000 ms&lt;BR /&gt;4 - thread 20 finished&lt;BR /&gt;5 - thread 20 sleeping 3000 ms&lt;BR /&gt;5 - thread 20 finished&lt;BR /&gt;6 - thread 20 sleeping 2000 ms&lt;BR /&gt;6 - thread 20 finished&lt;BR /&gt;7 - thread 20 sleeping 0 ms&lt;BR /&gt;7 - thread 20 finished&lt;BR /&gt;8 - thread 20 sleeping 2000 ms&lt;BR /&gt;8 - thread 20 finished&lt;BR /&gt;9 - thread 20 sleeping 3000 ms&lt;BR /&gt;9 - thread 20 finished&lt;BR /&gt;10 - thread 20 sleeping 4000 ms&lt;BR /&gt;10 - thread 20 finished&lt;BR /&gt;11 - thread 20 sleeping 3000 ms&lt;BR /&gt;11 - thread 20 finished&lt;BR /&gt;12 - thread 20 sleeping 0 ms&lt;BR /&gt;12 - thread 20 finished&lt;BR /&gt;13 - thread 20 sleeping 0 ms&lt;BR /&gt;13 - thread 20 finished&lt;BR /&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;/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;We observe that 1) all service tasks are executed on the same thread and 2) they are executed sequentially.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For me the impact of this is that we should NEVER put any long-executing async service tasks (e.g. report generation) in a process definition because they can potentially block all execution paths of the process instance. Rather we should have the service task finish quickly, and do the real execution async somewhere else. A receive task after the service task could wait for execution to continue.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So it is true that the current implementation does not impact process performance as such, but the risk of creating "bottlenecks" is very real if any of your service tasks is long running. In "real world" processes it are the machine oriented process flows (=many service tasks, little or no user tasks) that will suffer more from this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks for any thoughts on this.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 09 Mar 2012 12:24:18 GMT</pubDate>
    <dc:creator>heymjo</dc:creator>
    <dc:date>2012-03-09T12:24:18Z</dc:date>
    <item>
      <title>5.9 and exclusive jobs</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99244#M68565</link>
      <description>Hi,Just wanted to share this observation, maybe other people have the same opinion. The doc says about exclusive jobs:It is actually not a performance issue. Performance is an issue under heavy load. Heavy load means that all worker threads of the job executor are busy all the time.I wanted to get a</description>
      <pubDate>Fri, 09 Mar 2012 12:24:18 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99244#M68565</guid>
      <dc:creator>heymjo</dc:creator>
      <dc:date>2012-03-09T12:24:18Z</dc:date>
    </item>
    <item>
      <title>Re: 5.9 and exclusive jobs</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99245#M68566</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Consider:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;- If you only have a single process instance in db: Since activiti enforces sequential execution of the process instance, the instance itself runs longer than if tasks from the instance would be executed concurrently.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;- If you have multiple process instances: each thread of the job executor will execute a single instance. You will still do work concurrently but from different instances.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 Mar 2012 12:43:23 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99245#M68566</guid>
      <dc:creator>meyerd</dc:creator>
      <dc:date>2012-03-09T12:43:23Z</dc:date>
    </item>
    <item>
      <title>Re: 5.9 and exclusive jobs</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99246#M68567</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Long running service tasks are always a problem: since delegates are invoked synchronously, the transaction will be keept open for the time you work. If you take a long time to finish the work you will either run into transaction timeouts or lock the underlying resource (db) for too long.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also keep in mind that the job executor has a max lock time after which it will assume that a job has failed.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 Mar 2012 12:51:43 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/5-9-and-exclusive-jobs/m-p/99246#M68567</guid>
      <dc:creator>meyerd</dc:creator>
      <dc:date>2012-03-09T12:51:43Z</dc:date>
    </item>
  </channel>
</rss>

