<?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: Recommended approach for long running tasks in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226715#M179845</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I see 2 possibilities:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-&amp;gt; send executionId to the parallel thread and call RuntimeService.signal(execId, signalName, data)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-&amp;gt; subscribe to signal (similar to intermediate signal catch event) and start parallel thread afterwards.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 20 May 2016 12:58:42 GMT</pubDate>
    <dc:creator>martin_grofcik</dc:creator>
    <dc:date>2016-05-20T12:58:42Z</dc:date>
    <item>
      <title>Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226707#M179837</link>
      <description>What is the recommended approach to run a long running task? Currently I'm using a java service task which starts the external processes via ProcessBuilder. In extreme cases these processes can run for hours and days.From what I found on this forum regarding the same question it may be that some act</description>
      <pubDate>Thu, 12 May 2016 07:46:40 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226707#M179837</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-12T07:46:40Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226708#M179838</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;In addition here's the code I'm using, unfortunately I'm not allowed to edit my post.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Creation of the task:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;ServiceTask task = new ServiceTask();&lt;BR /&gt;task.setAsynchronous( true);&lt;BR /&gt;task.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS); &lt;BR /&gt;task.setImplementation( "application.ShellTask");&lt;BR /&gt; &lt;BR /&gt;List&amp;lt;FieldExtension&amp;gt; fields = new ArrayList&amp;lt;&amp;gt;();&lt;BR /&gt;&lt;BR /&gt;FieldExtension field = new FieldExtension();&lt;BR /&gt;field.setFieldName( "shellCommand");&lt;BR /&gt;field.setStringValue( "notepad.exe");&lt;BR /&gt;fields.add( field);&lt;BR /&gt;&lt;BR /&gt;task.setFieldExtensions( fields);&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;and the process invoker, it simply executes the process asynchronouosly, here simply using Runtime's exec method:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;package application;&lt;BR /&gt;&lt;BR /&gt;import org.activiti.engine.delegate.DelegateExecution;&lt;BR /&gt;import org.activiti.engine.delegate.Expression;&lt;BR /&gt;import org.activiti.engine.delegate.JavaDelegate;&lt;BR /&gt; &lt;BR /&gt;public class ShellTask implements JavaDelegate {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; Expression shellCommand;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; public void execute(DelegateExecution execution) throws Exception {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String command = (String) shellCommand.getValue( execution);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Runtime.getRuntime().exec( command);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;} &lt;BR /&gt;&lt;/CODE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 May 2016 11:47:30 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226708#M179838</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-12T11:47:30Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226709#M179839</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Yes there is, you have to make your shell script asynchronous. It means that it will just get signal from activiti to do something and immediately returns.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;After that process execution can wait in signal/message intermediate catching event to process further.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 15 May 2016 16:31:18 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226709#M179839</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-15T16:31:18Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226710#M179840</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you. I read that up. If I understand it correctly, that means I'd have to model it explicitly in the BPMN workflow, doesn't it? Is there no other way, i. e. internally via code?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;What I would like to have in terms of the bpmn model:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Start Event -&amp;gt; Java Service Task which executes a Process asynchronously in another thread -&amp;gt; End Event&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;where End Event isn't reached until the external (async) process is finished. I'd prefer that you wouldn't have to model another element between the Service Task and the End Event, if possible. Because if I have 10 elements in sequence, that intermediate catching event necessity would make 20 elements of it. Which normally wouldn't be a problem, but it increases complexity for the ones who model the workflow.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 16 May 2016 05:30:56 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226710#M179840</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-16T05:30:56Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226711#M179841</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The proposed changes affect process model and service implementation too.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If the only issue is the complexity of the model, you have several possibilities to cope with that: e.g.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1. Encapsulate call into subprocess,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;2. create custom task to do the job.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 16 May 2016 13:07:16 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226711#M179841</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-16T13:07:16Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226712#M179842</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you Martin. "Encapsulating call into subprocess" is my 2nd option, thanks to your help I now know how to wait for the async task completion using the eventing mechanism. However, I'd rather have your "create custom task" suggestion, but I don't exactly know what you mean.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Should I extend from AbstractCustomServiceTask, implement my own ActivitiBehaviour or create my own custom extension as described here:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.activiti.org/userguide/#bpmnCustomExtensions" rel="nofollow noopener noreferrer"&gt;http://www.activiti.org/userguide/#bpmnCustomExtensions&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Again, thank you very much for you help!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 17 May 2016 05:34:44 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226712#M179842</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-17T05:34:44Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226713#M179843</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It depends on your requirements, how far you go. &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Let's start with the simple custom task and you can extend it further….&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 17 May 2016 07:19:37 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226713#M179843</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-17T07:19:37Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226714#M179844</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;So after searching how to create a simple custom task I ended up with the information that instead of a JavaDelegate I'd have to implement SignallableActivityBehavior.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The problem I'm facing now that the signal doesn't arrive. All I could send is signal( executionId), but I need a custom signal (success, error, etc), without knowing the execution id.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My code simplified:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;public class MyCustomTask implements SignallableActivityBehavior {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; public static String MY_CUSTOM_TASK_SIGNAL = "TaskFinishedSignal";&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; @Override&lt;BR /&gt;&amp;nbsp; public void execute(ActivityExecution execution) throws Exception {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread thread = new Thread( new MyRunnable());&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread.start();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; @Override&lt;BR /&gt;&amp;nbsp; public void signal(ActivityExecution execution, String signalEvent, Object signalData) throws Exception {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( !MY_CUSTOM_TASK_SIGNAL.equals( signalEvent))&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PvmTransition transition = execution.getActivity().getOutgoingTransitions().get( 0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; execution.take( transition);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;public class MyRunnable implements Runnable {&lt;BR /&gt;&lt;BR /&gt; @Override&lt;BR /&gt; public void run() {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; try {&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; System.out.println( "Start MyRunnable");&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; Thread.sleep( 10000);&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; System.out.println( "Stop MyRunnable");&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; } catch( InterruptedException e) {&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; e.printStackTrace();&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; } finally {&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; Map&amp;lt;String,Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp; processEngine.getRuntimeService().signal( MY_CUSTOM_TASK_SIGNAL, map);&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;I can't hand over the execution id to the runnable because otherwise the MyRunnable class would have to manage it. All it should have to do is to simply send a signal that the task is finished.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone know how to do that? Or is there a better approach, i. e. can I set a wait state in the execute method and send a signal afterwards?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 May 2016 11:31:46 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226714#M179844</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-20T11:31:46Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226715#M179845</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I see 2 possibilities:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-&amp;gt; send executionId to the parallel thread and call RuntimeService.signal(execId, signalName, data)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-&amp;gt; subscribe to signal (similar to intermediate signal catch event) and start parallel thread afterwards.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 May 2016 12:58:42 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226715#M179845</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-20T12:58:42Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226716#M179846</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you very much, Martin! I think the first suggestion is the one I should be going with. Although there is no method with the signature signal( execId, signalName, data). All I've seen is that I can only hand over a map to the signal and evaluate that one. The signalEvent and the signalData of&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;public void signal(ActivityExecution execution, String signalEvent, Object signalData)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;are null.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm using a process manager now which uses a registry with system process id &amp;lt;&amp;gt; activiti execution id mapping. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Basically this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;public class ProcessManager {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; public static Map&amp;lt;Integer,String&amp;gt; registry = new HashMap&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; public static void register( Integer processId, String executionId) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; registry.put( processId, executionId);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; public static void unregister( Integer processId) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; registry.remove( processId);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;BR /&gt;&lt;BR /&gt;public class ShellTask implements SignallableActivityBehavior {&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; @Override&lt;BR /&gt;&amp;nbsp; public void execute(ActivityExecution execution) throws Exception {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread thread = new Thread( new ProcessExecutor( execution.getId()));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread.start();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; @Override&lt;BR /&gt;&amp;nbsp; public void signal(ActivityExecution execution, String signalEvent, Object signalData) throws Exception {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map&amp;lt;String,Object&amp;gt; map = execution.getVariables();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println( "EXECUTION_RESULT = " + map.get( "EXECUTION_RESULT"));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( !map.containsKey( "EXECUTION_RESULT")&lt;BR /&gt; return;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PvmTransition transition = execution.getActivity().getOutgoingTransitions().get( 0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; execution.take( transition);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;BR /&gt;&lt;BR /&gt;public class ProcessExecutor implements Runnable {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; private Integer processId;&lt;BR /&gt;&amp;nbsp; private String executionId;&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; public ProcessExecutor( String executionId) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.executionId = executionId;&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp; &lt;BR /&gt;&amp;nbsp; @Override&lt;BR /&gt;&amp;nbsp; public void run() {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Process process = Runtime.getRuntime().exec( "notepad.exe");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; processId = process.getId();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessManager.register( processId, executionId);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.waitFor(); // just for testing; the actual process will run asynchronously&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch( IOException | InterruptedException e) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send signal after process finishes&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // just for testing; this block will be executed in a process monitor which checks if the async process has completed&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map&amp;lt;String,Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map.put( "EXECUTION_RESULT", "SUCCESS");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; processEngine.getRuntimeService().signal( executionId, map);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessManager.unregister( processId);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;Of course the registry should store the data in the database in order to survive a server restart.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If there's a better approach or something like this that's already available in Activiti, I'd be glad to hear it. &lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 21 May 2016 07:07:25 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226716#M179846</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-21T07:07:25Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226717#M179847</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Lofi / Martin,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For the&amp;nbsp; RuntimeService.signal(execId, signalName, signalData) call, you may want to note that the signal in the RuntimeService.signal and the signal of the signalName/signalData are two different concepts as explained by Joram in &lt;/SPAN&gt;&lt;A href="https://forums.activiti.org/content/unable-signal-process#post-34473" rel="nofollow noopener noreferrer"&gt;this&lt;/A&gt;&lt;SPAN&gt; post.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Basically the method call signal refers to a 'trigger', while the signal objects in the signature are 'BPMN Signal' artefacts. &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Subscribing to a signal is most likely not going to be helpful, since those 'subscribe-able signals' are expected to be thrown from _within_ the engine, by some (other) running instance.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Rajiv&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 23 May 2016 00:49:23 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226717#M179847</guid>
      <dc:creator>rajivmoghe</dc:creator>
      <dc:date>2016-05-23T00:49:23Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226718#M179848</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thank you very much Rajiv! Following your link I found this one in your post:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://long-running.net/blog/2015/should-asynchronous-service-invocations-be-visible-in-a-bpmn-diagram/" rel="nofollow noopener noreferrer"&gt;http://long-running.net/blog/2015/should-asynchronous-service-invocations-be-visible-in-a-bpmn-diagram/&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It confirms that the SignallableActivityBehavior with sending a signal( executionId) and an optional map with parameters seems to be the right approach. &lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 23 May 2016 06:18:09 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226718#M179848</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-23T06:18:09Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226719#M179849</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Rajiv,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;Subscribing to a signal is most likely not going to be helpful, since those 'subscribe-able signals' are expected to be thrown from _within_ the engine, by some (other) running instance.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt;Subscribing to signals can help. &lt;/SPAN&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;&amp;nbsp; /**&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * Notifies the process engine that a signal event of name 'signalName' has been received. This method delivers the signal to a single execution, being the execution referenced by 'executionId'. The&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * waiting execution is notified synchronously.&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * &lt;BR /&gt;&amp;nbsp;&amp;nbsp; * @param signalName&lt;BR /&gt;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the name of the signal event&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * @param executionId&lt;BR /&gt;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the id of the execution to deliver the signal to&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * @param processVariables&lt;BR /&gt;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a map of variables added to the execution(s)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * @throws ActivitiObjectNotFoundException&lt;BR /&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; if no such execution exists.&lt;BR /&gt;&amp;nbsp;&amp;nbsp; * @throws ActivitiException&lt;BR /&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; if the execution has not subscribed to the signal&lt;BR /&gt;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;&amp;nbsp; void signalEventReceived(String signalName, String executionId, Map&amp;lt;String, Object&amp;gt; processVariables);&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;Signals (and messages) can be invoked outside of the engine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 23 May 2016 06:19:34 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226719#M179849</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-23T06:19:34Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226720#M179850</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;Subscribing to signals can help. Signals (and messages) can be invoked outside of the engine.&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;SPAN&gt;How do you subscribe to a signal from within a JavaDelegate or an ActivitiBehavior? &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you very much!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 24 May 2016 04:01:16 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226720#M179850</guid>
      <dc:creator>lofi</dc:creator>
      <dc:date>2016-05-24T04:01:16Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226721#M179851</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;example&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;&amp;nbsp; public void execute(DelegateExecution execution) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExecutionEntity executionEntity = (ExecutionEntity) execution;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Context.getCommandContext().getEventSubscriptionEntityManager().insertSignalEvent(signalEventDefinition, signal, executionEntity);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 24 May 2016 19:20:15 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226721#M179851</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-24T19:20:15Z</dc:date>
    </item>
    <item>
      <title>Re: Recommended approach for long running tasks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226722#M179852</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi Lofi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;example&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;CODE&gt;&lt;BR /&gt;&amp;nbsp; public void execute(DelegateExecution execution) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExecutionEntity executionEntity = (ExecutionEntity) execution;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Context.getCommandContext().getEventSubscriptionEntityManager().insertSignalEvent(signalEventDefinition, signal, executionEntity);&lt;BR /&gt;&amp;nbsp; }&lt;BR /&gt;&lt;/CODE&gt;&lt;BR /&gt;&lt;SPAN&gt;regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Martin&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 24 May 2016 19:20:17 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/recommended-approach-for-long-running-tasks/m-p/226722#M179852</guid>
      <dc:creator>martin_grofcik</dc:creator>
      <dc:date>2016-05-24T19:20:17Z</dc:date>
    </item>
  </channel>
</rss>

