<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=JBPM_6_Filip</id>
	<title>JBPM 6 Filip - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=JBPM_6_Filip"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=JBPM_6_Filip&amp;action=history"/>
	<updated>2026-04-21T09:05:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=JBPM_6_Filip&amp;diff=66336&amp;oldid=prev</id>
		<title>Fstachecki: /* UserTask */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=JBPM_6_Filip&amp;diff=66336&amp;oldid=prev"/>
		<updated>2018-04-19T19:45:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;UserTask&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Cat|Private}}&lt;br /&gt;
=Exercises=&lt;br /&gt;
==Inclusive Gateway==&lt;br /&gt;
[[File:Eclipse01InclusiveGateway.png]]&lt;br /&gt;
*default path may not work (Eclipse bug)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
		/**&lt;br /&gt;
		 * A salesman will get a 100 bonus if his sales is over 1000&lt;br /&gt;
		 * if his sales is over 5000 he will get a car as well&lt;br /&gt;
		 * if his sales is over 10000 he will be made a Managing Director&lt;br /&gt;
		 * &lt;br /&gt;
		 * 1. Create appropriate gateway and process variables&lt;br /&gt;
		 * 2. Create a test which checks appropriate End events (NodeTriggered)&lt;br /&gt;
		 */&lt;br /&gt;
		createRuntimeManager(&amp;quot;inclusive.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
        params.put(&amp;quot;sales&amp;quot;, 15000);&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn&amp;quot;, params);&lt;br /&gt;
        //Ends 1 to 3 will be reached&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;End1&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;End2&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;End3&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parallel Gateway==&lt;br /&gt;
[[File:Eclipse02ParallelGateway.png]]&lt;br /&gt;
&lt;br /&gt;
* no variables, no params (remove params attribute from startProcess method)&lt;br /&gt;
* just 2 script tasks&lt;br /&gt;
* change second parallel gateway type to &amp;#039;&amp;#039;&amp;#039;Converging&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
		createRuntimeManager(&amp;quot;BPMN2-Parallel.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Trip booking requires booking hotel and the flight&lt;br /&gt;
		 * These things can be done concurrently (use parallel gateway)&lt;br /&gt;
		 * &lt;br /&gt;
		 * Advanced:&lt;br /&gt;
		 * If booking of a hotel or flight fails, create a mechanism for cancelling the reservation (use exclusive gateway)&lt;br /&gt;
		 */&lt;br /&gt;
	&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Hotel&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Flight&amp;quot;);&lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parallel Gateway - Compensation==&lt;br /&gt;
[[File:Eclipse02ParallelAdvanced.png]]&lt;br /&gt;
&lt;br /&gt;
* we want to check the result of booking&lt;br /&gt;
* 2 process variables: hotelBooked:boolean, flightBooked:boolean&lt;br /&gt;
* conditions:&lt;br /&gt;
** return (hotelBooked &amp;amp;&amp;amp; flightBooked);&lt;br /&gt;
** return (! hotelBooked &amp;amp;&amp;amp; ! flightBooked);&lt;br /&gt;
** return (hotelBooked &amp;amp;&amp;amp; ! flightBooked);&lt;br /&gt;
** return (! hotelBooked &amp;amp;&amp;amp; flightBooked);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ProcessTestAdvanced extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
		createRuntimeManager(&amp;quot;ParallelAdvanced.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
        params.put(&amp;quot;hotelBooked&amp;quot;, false);&lt;br /&gt;
        params.put(&amp;quot;flightBooked&amp;quot;, false);&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.advanced&amp;quot;,params);&lt;br /&gt;
		&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Hotel&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Flight&amp;quot;);&lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;both failed&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcessBothOK() throws Exception {&lt;br /&gt;
		createRuntimeManager(&amp;quot;ParallelAdvanced.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
        params.put(&amp;quot;hotelBooked&amp;quot;, true);&lt;br /&gt;
        params.put(&amp;quot;flightBooked&amp;quot;, true);&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.advanced&amp;quot;,params);&lt;br /&gt;
        &lt;br /&gt;
//        System.out.println(params.get(&amp;quot;hotelBooked&amp;quot;));&lt;br /&gt;
//		System.out.println(params.get(&amp;quot;hotelBooked&amp;quot;));&lt;br /&gt;
		&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Hotel&amp;quot;);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;Book Flight&amp;quot;);&lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
        assertNodeTriggered(processInstance.getId(),&amp;quot;both OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Timer - delay==&lt;br /&gt;
* Timer event has two expressions sections:&lt;br /&gt;
** first - specific time&lt;br /&gt;
** second - specific cycle&lt;br /&gt;
:[[File:ClipCapIt-150205-092359.PNG]]&lt;br /&gt;
&lt;br /&gt;
* If you can&amp;#039;t connect script task to intermediate timer event use context menu:&lt;br /&gt;
:[[File:ClipCapIt-150205-115534.PNG]]&lt;br /&gt;
&lt;br /&gt;
Scenario: A boyfriend sends an SMS message for his girlfriend. She waits 5s and sends reply SMS message. &lt;br /&gt;
&lt;br /&gt;
[[File:Eclipse03Timer.png]]&lt;br /&gt;
&lt;br /&gt;
* timer - time duration 5s&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws InterruptedException {&lt;br /&gt;
		RuntimeManager manager = createRuntimeManager(&amp;quot;sample.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
		ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		assertNodeTriggered(processInstance.getId(), &amp;quot;Receive SMS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		assertProcessInstanceActive(processInstance.getId(), ksession);&lt;br /&gt;
		// now wait for 2 seconds for timer to trigger&lt;br /&gt;
		Thread.sleep(2000);&lt;br /&gt;
		assertProcessInstanceActive(processInstance.getId(), ksession);&lt;br /&gt;
		&lt;br /&gt;
		Thread.sleep(4000);&lt;br /&gt;
		//Here process instance is no longer active&lt;br /&gt;
		//assertProcessInstanceActive(processInstance.getId(), ksession);&lt;br /&gt;
		&lt;br /&gt;
		// check whether the process instance has completed successfully&lt;br /&gt;
		assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
		&lt;br /&gt;
		manager.disposeRuntimeEngine(engine);&lt;br /&gt;
		manager.close();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===05.2_timer_boundary_interrupting_time===&lt;br /&gt;
*To add boundary event drag and drop event from boundary section - not from Intermediate catching section.&lt;br /&gt;
:[[File:ClipCapIt-150205-002710.PNG]]&lt;br /&gt;
&lt;br /&gt;
===05.3_timer_boundary_non_interrupting_cycle===&lt;br /&gt;
timer cycle 500ms###1s is 500ms initial delay + 1s delay -after 0.5s every 1s&lt;br /&gt;
&lt;br /&gt;
==Loop ==&lt;br /&gt;
[[File:EclipseLoopExample.png]]&lt;br /&gt;
&lt;br /&gt;
* Init task&lt;br /&gt;
 kcontext.setVariable(&amp;quot;i&amp;quot;, 0);&lt;br /&gt;
* loop task&lt;br /&gt;
 System.out.println(&amp;quot;i = &amp;quot; + i);&lt;br /&gt;
 kcontext.setVariable(&amp;quot;i&amp;quot;, i+1);&lt;br /&gt;
* done task&lt;br /&gt;
 System.out.println(&amp;quot;Loop completed&amp;quot;);&lt;br /&gt;
* conditions&lt;br /&gt;
 return i &amp;lt; count;&lt;br /&gt;
&lt;br /&gt;
 return true; (change to  default flow)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LoopingExample extends JbpmJUnitBaseTestCase {&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws MalformedURLException {&lt;br /&gt;
		createRuntimeManager(&amp;quot;Looping.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
		params.put(&amp;quot;count&amp;quot;, 5);&lt;br /&gt;
		ksession.startProcess(&amp;quot;com.sample.looping&amp;quot;, params);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multi instance==&lt;br /&gt;
[[File:EclipseMIExample.png]]&lt;br /&gt;
* Say Hi task&lt;br /&gt;
 System.out.println(kcontext.getVariable(&amp;quot;mi_person_name&amp;quot;) );&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MultipleInstanceExample extends JbpmJUnitBaseTestCase {&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess(){&lt;br /&gt;
		createRuntimeManager(&amp;quot;multipleinstance.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
		Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
		List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
		list.add(&amp;quot;Bernard&amp;quot;);&lt;br /&gt;
		list.add(&amp;quot;Greg&amp;quot;);&lt;br /&gt;
		list.add(&amp;quot;Phil&amp;quot;);&lt;br /&gt;
		params.put(&amp;quot;list&amp;quot;, list);&lt;br /&gt;
		ksession.startProcess(&amp;quot;com.sample.multipleinstance&amp;quot;, params);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* to set MI attributes change editor to &amp;#039;&amp;#039;&amp;#039;BPMN2 Process Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
[[File:EclipseMIExampleBPMN2ProcessEditorView.png]]&lt;br /&gt;
* 07.1_exercise&lt;br /&gt;
**copy BPMN file from 07_looping_multiinstance and add gateway:&lt;br /&gt;
:[[File:MIsendEmail.png]]&lt;br /&gt;
**Sent e-mail task:&lt;br /&gt;
 System.out.println(&amp;quot;E-mail sent to: &amp;quot; + kcontext.getVariable(&amp;quot;mi_person_name&amp;quot;) );&lt;br /&gt;
** conditions&lt;br /&gt;
 return kcontext.getVariable(&amp;quot;mi_person_name&amp;quot;) != &amp;quot;Greg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
==Boundary events==&lt;br /&gt;
* Message event in jBPM is implemented as signal event&lt;br /&gt;
 //If you send a message, it will be Message-ID&lt;br /&gt;
 ksession.signalEvent(&amp;quot;Message-BookingCancelation&amp;quot;,null,processInstance.getId());&lt;br /&gt;
&lt;br /&gt;
[[File:jBPMevents.png]]&lt;br /&gt;
&lt;br /&gt;
https://www.packtpub.com/networking-and-servers/jbpm-6-developer-guide&lt;br /&gt;
&lt;br /&gt;
===Message boundary exercise===&lt;br /&gt;
* Create new jBPM Project (not MAVEN, not KJAR)&lt;br /&gt;
:[[File:ClipCapIt-150205-173728.PNG]]&lt;br /&gt;
* Add process variable (string)&lt;br /&gt;
:[[File:ClipCapIt-150205-174219.PNG]]&lt;br /&gt;
* Define Message Event&lt;br /&gt;
:[[File:ClipCapIt-150205-174434.PNG]]&lt;br /&gt;
** Assign target to process variable&lt;br /&gt;
:[[File:ClipCapIt-150205-174518.PNG]]&lt;br /&gt;
* Write JUnit test &lt;br /&gt;
** add add &amp;#039;&amp;#039;&amp;#039;throws Exception&amp;#039;&amp;#039;&amp;#039; to test method (to use Thread.sleep):&lt;br /&gt;
 @Test&lt;br /&gt;
 	public void testProcess() throws Exception {&lt;br /&gt;
&lt;br /&gt;
* final code&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.sample;&lt;br /&gt;
&lt;br /&gt;
import org.jbpm.test.JbpmJUnitBaseTestCase;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.kie.api.runtime.KieSession;&lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeEngine;&lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeManager;&lt;br /&gt;
import org.kie.api.runtime.process.ProcessInstance;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is a sample file to test a process.&lt;br /&gt;
 */&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
		RuntimeManager manager = createRuntimeManager(&amp;quot;sample.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
		&lt;br /&gt;
		ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.hello&amp;quot;);&lt;br /&gt;
		// check whether the process instance has completed successfully&lt;br /&gt;
		&lt;br /&gt;
		Thread.sleep(1000);&lt;br /&gt;
		ksession.signalEvent(&amp;quot;Message-CancelMessage&amp;quot;,null,processInstance.getId());&lt;br /&gt;
		assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
		//assertNodeTriggered(processInstance.getId(), &amp;quot;Hello&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		manager.disposeRuntimeEngine(engine);&lt;br /&gt;
		manager.close();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Change boundary event type to non interrupting and change test:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
		RuntimeManager manager = createRuntimeManager(&amp;quot;sample.bpmn&amp;quot;);&lt;br /&gt;
		RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
		KieSession ksession = engine.getKieSession();&lt;br /&gt;
		&lt;br /&gt;
		ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.hello&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		Thread.sleep(1000);&lt;br /&gt;
		ksession.signalEvent(&amp;quot;Message-CancelMessage&amp;quot;,null,processInstance.getId());&lt;br /&gt;
		Thread.sleep(1000);&lt;br /&gt;
		ksession.signalEvent(&amp;quot;Message-CancelMessage&amp;quot;,null,processInstance.getId());&lt;br /&gt;
		Thread.sleep(10000);&lt;br /&gt;
		manager.disposeRuntimeEngine(engine);&lt;br /&gt;
		manager.close();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Console window:&lt;br /&gt;
 inside&lt;br /&gt;
 message received&lt;br /&gt;
 message received&lt;br /&gt;
 after&lt;br /&gt;
&lt;br /&gt;
===Error boundary exercise===&lt;br /&gt;
* Create process with error events&lt;br /&gt;
:[[File:ClipCapIt-150205-192044.PNG]]&lt;br /&gt;
* process variables:&lt;br /&gt;
** ok:Boolean (for a gateway)&lt;br /&gt;
** errorVar:Integer&lt;br /&gt;
* Add Error Event details&lt;br /&gt;
** Error End Event&lt;br /&gt;
:[[File:ClipCapIt-150205-194303.PNG]]&lt;br /&gt;
** Error Boundary Intermediate Event&lt;br /&gt;
:[[File:ClipCapIt-150205-194423.PNG]]&lt;br /&gt;
* JUnit code&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.sample; &lt;br /&gt;
 &lt;br /&gt;
import java.util.HashMap; &lt;br /&gt;
import java.util.Map; &lt;br /&gt;
 &lt;br /&gt;
import org.jbpm.test.JbpmJUnitBaseTestCase; &lt;br /&gt;
import org.junit.Test; &lt;br /&gt;
import org.kie.api.runtime.KieSession; &lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeEngine; &lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeManager; &lt;br /&gt;
import org.kie.api.runtime.process.ProcessInstance; &lt;br /&gt;
 &lt;br /&gt;
/** &lt;br /&gt;
 * This is a sample file to test a process. &lt;br /&gt;
 */ &lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase { &lt;br /&gt;
 &lt;br /&gt;
    @Test &lt;br /&gt;
    public void testProcessNoErrors() { &lt;br /&gt;
        RuntimeManager manager = createRuntimeManager(&amp;quot;ErrorBoundary.bpmn&amp;quot;); &lt;br /&gt;
        RuntimeEngine engine = getRuntimeEngine(null); &lt;br /&gt;
        KieSession ksession = engine.getKieSession(); &lt;br /&gt;
         &lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;(); &lt;br /&gt;
        params.put(&amp;quot;ok&amp;quot;, true); &lt;br /&gt;
         &lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.hello&amp;quot;, params); &lt;br /&gt;
 &lt;br /&gt;
        // check whether the process instance has completed successfully &lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession); &lt;br /&gt;
         &lt;br /&gt;
        manager.disposeRuntimeEngine(engine); &lt;br /&gt;
        manager.close(); &lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    @Test &lt;br /&gt;
    public void testProcessError() { &lt;br /&gt;
        RuntimeManager manager = createRuntimeManager(&amp;quot;ErrorBoundary.bpmn&amp;quot;); &lt;br /&gt;
        RuntimeEngine engine = getRuntimeEngine(null); &lt;br /&gt;
        KieSession ksession = engine.getKieSession(); &lt;br /&gt;
         &lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;(); &lt;br /&gt;
        params.put(&amp;quot;ok&amp;quot;, false); //trigger error &lt;br /&gt;
         &lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.bpmn.hello&amp;quot;, params); &lt;br /&gt;
 &lt;br /&gt;
        // check whether the process instance has completed successfully &lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession); &lt;br /&gt;
         &lt;br /&gt;
        manager.disposeRuntimeEngine(engine); &lt;br /&gt;
        manager.close(); &lt;br /&gt;
    } &lt;br /&gt;
     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Event-Based Gateway==&lt;br /&gt;
* Create diagram&lt;br /&gt;
:[[File:ClipCapIt-150205-232601.PNG]]&lt;br /&gt;
* JUnit test&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.nobleprog;&lt;br /&gt;
&lt;br /&gt;
import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;&lt;br /&gt;
import org.jbpm.test.JbpmJUnitBaseTestCase;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.kie.api.runtime.KieSession;&lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeEngine;&lt;br /&gt;
import org.kie.api.runtime.process.ProcessInstance;&lt;br /&gt;
&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testProcessMessage1() throws Exception {&lt;br /&gt;
        &lt;br /&gt;
        createRuntimeManager(&amp;quot;EventBasedGateway-Loan.bpmn2&amp;quot;);&lt;br /&gt;
        RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
        KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.test&amp;quot;);&lt;br /&gt;
        ksession.signalEvent(&amp;quot;Message-Message_1&amp;quot;, null, processInstance.getId());&lt;br /&gt;
        &lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void testProcessTimer() throws Exception {&lt;br /&gt;
        &lt;br /&gt;
        createRuntimeManager(&amp;quot;EventBasedGateway-Loan.bpmn2&amp;quot;);&lt;br /&gt;
        RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
        KieSession ksession = engine.getKieSession();&lt;br /&gt;
&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.test&amp;quot;);&lt;br /&gt;
        Thread.sleep(6000);&lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compensation==&lt;br /&gt;
* Create diagram&lt;br /&gt;
:[[File:ClipCapIt-150206-000714.PNG]]&lt;br /&gt;
:* to add compensation boundary event drag and drop empty boundary event and change event definition&lt;br /&gt;
:* then drag and drop script task and connect boundary event with the task using association&lt;br /&gt;
* JUnit code&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.sample; &lt;br /&gt;
 &lt;br /&gt;
import java.util.HashMap; &lt;br /&gt;
import java.util.Map; &lt;br /&gt;
 &lt;br /&gt;
import org.jbpm.test.JbpmJUnitBaseTestCase; &lt;br /&gt;
import org.junit.Test; &lt;br /&gt;
import org.kie.api.runtime.KieSession; &lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeEngine; &lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeManager; &lt;br /&gt;
import org.kie.api.runtime.process.ProcessInstance; &lt;br /&gt;
 &lt;br /&gt;
/** &lt;br /&gt;
 * This is a sample file to test a process. &lt;br /&gt;
 */ &lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase { &lt;br /&gt;
 &lt;br /&gt;
    @Test &lt;br /&gt;
    public void testProcess() { &lt;br /&gt;
         &lt;br /&gt;
        RuntimeManager manager = createRuntimeManager(&amp;quot;BPMN2-Compensation-IntermediateThrowEvent.bpmn2&amp;quot;); &lt;br /&gt;
        RuntimeEngine engine = getRuntimeEngine(null); &lt;br /&gt;
        KieSession ksession = engine.getKieSession(); &lt;br /&gt;
         &lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();  &lt;br /&gt;
         params.put(&amp;quot;x&amp;quot;, 10); &lt;br /&gt;
         &lt;br /&gt;
        System.out.println(&amp;quot;Initialized value: &amp;quot; + params.get(&amp;quot;x&amp;quot;)); &lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;CompensateIntermediateThrowEvent&amp;quot;, params);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
        // check whether the process instance has completed successfully &lt;br /&gt;
        assertProcessInstanceCompleted(processInstance.getId(), ksession); &lt;br /&gt;
         &lt;br /&gt;
        manager.disposeRuntimeEngine(engine); &lt;br /&gt;
        manager.close(); &lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;bpmn2:definitions xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:bpmn2=&amp;quot;http://www.omg.org/spec/BPMN/20100524/MODEL&amp;quot; xmlns:bpmndi=&amp;quot;http://www.omg.org/spec/BPMN/20100524/DI&amp;quot; xmlns:dc=&amp;quot;http://www.omg.org/spec/DD/20100524/DC&amp;quot; xmlns:di=&amp;quot;http://www.omg.org/spec/DD/20100524/DI&amp;quot; xmlns:tns=&amp;quot;http://www.jboss.org/drools&amp;quot; xmlns=&amp;quot;http://www.jboss.org/drools&amp;quot; xsi:schemaLocation=&amp;quot;http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd http://www.bpsim.org/schemas/1.0 bpsim.xsd&amp;quot; id=&amp;quot;Definition&amp;quot; expressionLanguage=&amp;quot;http://www.mvel.org/2.0&amp;quot; targetNamespace=&amp;quot;http://www.example.org/MinimalExample&amp;quot; typeLanguage=&amp;quot;http://www.java.com/javaTypes&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;bpmn2:itemDefinition id=&amp;quot;_xItem&amp;quot; structureRef=&amp;quot;String&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;bpmn2:itemDefinition id=&amp;quot;_Integer&amp;quot; structureRef=&amp;quot;Integer&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;bpmn2:process id=&amp;quot;CompensateIntermediateThrowEvent&amp;quot; tns:version=&amp;quot;1&amp;quot; tns:packageName=&amp;quot;defaultPackage&amp;quot; tns:adHoc=&amp;quot;false&amp;quot; name=&amp;quot;Compensate Intermediate Throw Event Process&amp;quot; isExecutable=&amp;quot;true&amp;quot; processType=&amp;quot;Private&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:property id=&amp;quot;x&amp;quot; itemSubjectRef=&amp;quot;_Integer&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:startEvent id=&amp;quot;_1&amp;quot; name=&amp;quot;StartProcess&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:outgoing&amp;gt;_1-_2&amp;lt;/bpmn2:outgoing&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:startEvent&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:sequenceFlow id=&amp;quot;_1-_2&amp;quot; tns:priority=&amp;quot;1&amp;quot; name=&amp;quot;&amp;quot; sourceRef=&amp;quot;_1&amp;quot; targetRef=&amp;quot;_2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:scriptTask id=&amp;quot;_2&amp;quot; name=&amp;quot;Task&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:incoming&amp;gt;_1-_2&amp;lt;/bpmn2:incoming&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:outgoing&amp;gt;SequenceFlow_1&amp;lt;/bpmn2:outgoing&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:script&amp;gt;System.out.println(&amp;amp;quot;Inside (before compensation): &amp;amp;quot; + x=99);&amp;lt;/bpmn2:script&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:scriptTask&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:boundaryEvent id=&amp;quot;_10&amp;quot; name=&amp;quot;CompensateEvent&amp;quot; attachedToRef=&amp;quot;_2&amp;quot; cancelActivity=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:compensateEventDefinition id=&amp;quot;CompensateEventDefinition_2&amp;quot; activityRef=&amp;quot;_2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:boundaryEvent&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:scriptTask id=&amp;quot;_11&amp;quot; name=&amp;quot;Compensate&amp;quot; isForCompensation=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:script&amp;gt;System.out.println(&amp;amp;quot;After compensation: &amp;amp;quot; + x);&amp;lt;/bpmn2:script&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:scriptTask&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:sequenceFlow id=&amp;quot;SequenceFlow_1&amp;quot; tns:priority=&amp;quot;1&amp;quot; name=&amp;quot;&amp;quot; sourceRef=&amp;quot;_2&amp;quot; targetRef=&amp;quot;_4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:intermediateThrowEvent id=&amp;quot;_4&amp;quot; name=&amp;quot;CompensateEvent&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:incoming&amp;gt;SequenceFlow_1&amp;lt;/bpmn2:incoming&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:outgoing&amp;gt;_4-_5&amp;lt;/bpmn2:outgoing&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:compensateEventDefinition id=&amp;quot;CompensateEventDefinition_1&amp;quot; activityRef=&amp;quot;_2&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:intermediateThrowEvent&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:sequenceFlow id=&amp;quot;_4-_5&amp;quot; tns:priority=&amp;quot;1&amp;quot; name=&amp;quot;&amp;quot; sourceRef=&amp;quot;_4&amp;quot; targetRef=&amp;quot;_5&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:endEvent id=&amp;quot;_5&amp;quot; name=&amp;quot;EndEvent&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmn2:incoming&amp;gt;_4-_5&amp;lt;/bpmn2:incoming&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmn2:endEvent&amp;gt;&lt;br /&gt;
    &amp;lt;bpmn2:association id=&amp;quot;_10-_11&amp;quot; sourceRef=&amp;quot;_10&amp;quot; targetRef=&amp;quot;_11&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/bpmn2:process&amp;gt;&lt;br /&gt;
  &amp;lt;bpmndi:BPMNDiagram id=&amp;quot;BPMNDiagram_1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;bpmndi:BPMNPlane id=&amp;quot;BPMNPlane_Process_1&amp;quot; bpmnElement=&amp;quot;CompensateIntermediateThrowEvent&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_StartEvent_1&amp;quot; bpmnElement=&amp;quot;_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;36.0&amp;quot; width=&amp;quot;36.0&amp;quot; x=&amp;quot;50.0&amp;quot; y=&amp;quot;57.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_IntermediateThrowEvent_1&amp;quot; bpmnElement=&amp;quot;_4&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;36.0&amp;quot; width=&amp;quot;36.0&amp;quot; x=&amp;quot;340.0&amp;quot; y=&amp;quot;57.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_EndEvent_1&amp;quot; bpmnElement=&amp;quot;_5&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;36.0&amp;quot; width=&amp;quot;36.0&amp;quot; x=&amp;quot;490.0&amp;quot; y=&amp;quot;57.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_ScriptTask_1&amp;quot; bpmnElement=&amp;quot;_2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;50.0&amp;quot; width=&amp;quot;110.0&amp;quot; x=&amp;quot;136.0&amp;quot; y=&amp;quot;50.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_BoundaryEvent_1&amp;quot; bpmnElement=&amp;quot;_10&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;36.0&amp;quot; width=&amp;quot;36.0&amp;quot; x=&amp;quot;173.0&amp;quot; y=&amp;quot;82.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNShape id=&amp;quot;BPMNShape_ScriptTask_2&amp;quot; bpmnElement=&amp;quot;_11&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;dc:Bounds height=&amp;quot;50.0&amp;quot; width=&amp;quot;110.0&amp;quot; x=&amp;quot;136.0&amp;quot; y=&amp;quot;150.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNShape&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNEdge id=&amp;quot;BPMNEdge_SequenceFlow_1&amp;quot; bpmnElement=&amp;quot;_1-_2&amp;quot; sourceElement=&amp;quot;BPMNShape_StartEvent_1&amp;quot; targetElement=&amp;quot;BPMNShape_ScriptTask_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;86.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;108.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;108.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;136.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNEdge&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNEdge id=&amp;quot;BPMNEdge_SequenceFlow_4&amp;quot; bpmnElement=&amp;quot;_4-_5&amp;quot; sourceElement=&amp;quot;BPMNShape_IntermediateThrowEvent_1&amp;quot; targetElement=&amp;quot;BPMNShape_EndEvent_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;376.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;427.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;427.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;490.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNEdge&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNEdge id=&amp;quot;BPMNEdge_Association_1&amp;quot; bpmnElement=&amp;quot;_10-_11&amp;quot; sourceElement=&amp;quot;BPMNShape_BoundaryEvent_1&amp;quot; targetElement=&amp;quot;BPMNShape_ScriptTask_2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;191.0&amp;quot; y=&amp;quot;118.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;191.0&amp;quot; y=&amp;quot;132.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;191.0&amp;quot; y=&amp;quot;132.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;191.0&amp;quot; y=&amp;quot;150.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNEdge&amp;gt;&lt;br /&gt;
      &amp;lt;bpmndi:BPMNEdge id=&amp;quot;BPMNEdge_SequenceFlow_5&amp;quot; bpmnElement=&amp;quot;SequenceFlow_1&amp;quot; sourceElement=&amp;quot;BPMNShape_ScriptTask_1&amp;quot; targetElement=&amp;quot;BPMNShape_IntermediateThrowEvent_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;246.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;288.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;288.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;di:waypoint xsi:type=&amp;quot;dc:Point&amp;quot; x=&amp;quot;340.0&amp;quot; y=&amp;quot;75.0&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/bpmndi:BPMNEdge&amp;gt;&lt;br /&gt;
    &amp;lt;/bpmndi:BPMNPlane&amp;gt;&lt;br /&gt;
  &amp;lt;/bpmndi:BPMNDiagram&amp;gt;&lt;br /&gt;
&amp;lt;/bpmn2:definitions&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UserTask - not working==&lt;br /&gt;
* Create new jBPM project&lt;br /&gt;
* Create BPMN diagram&lt;br /&gt;
:[[File:ClipCapIt-180419-173425.PNG]]&lt;br /&gt;
** set gateway type to diverging&lt;br /&gt;
** add approved:boolean local process variable&lt;br /&gt;
** add conditions after the gateway&lt;br /&gt;
** add script task script&lt;br /&gt;
&lt;br /&gt;
==Work Item==&lt;br /&gt;
Scenario: We need to get Order data to issue an invoice using external system. &lt;br /&gt;
&lt;br /&gt;
[[File:Eclipse06WorkItem.png]]&lt;br /&gt;
&lt;br /&gt;
Project Explorer&lt;br /&gt;
&lt;br /&gt;
[[File:Eclipse06WorkItemFoderStructure.png]]&lt;br /&gt;
&lt;br /&gt;
===Work Item Definition (GetOrder.wid)===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import org.drools.core.process.core.datatype.impl.type.StringDataType;&lt;br /&gt;
[&lt;br /&gt;
  [&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;GetOrder&amp;quot;,&lt;br /&gt;
    &amp;quot;parameters&amp;quot; : [&lt;br /&gt;
      &amp;quot;orderId&amp;quot; : new StringDataType(),&lt;br /&gt;
      &amp;quot;orderTotal&amp;quot; : new StringDataType(),&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;displayName&amp;quot; : &amp;quot;GetOrder&amp;quot;,&lt;br /&gt;
    &amp;quot;icon&amp;quot; : &amp;quot;icons/getoutlinetitle.gif&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===drools.rulebase.conf===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
drools.workDefinitions = GetOrder.wid&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Work Item Handler===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.nobleprog;&lt;br /&gt;
&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
&lt;br /&gt;
import org.kie.api.runtime.process.WorkItem;&lt;br /&gt;
import org.kie.api.runtime.process.WorkItemHandler;&lt;br /&gt;
import org.kie.api.runtime.process.WorkItemManager;&lt;br /&gt;
&lt;br /&gt;
public class GetOrderWorkItemHandler implements WorkItemHandler {&lt;br /&gt;
	  public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {&lt;br /&gt;
&lt;br /&gt;
	    // extract parameters&lt;br /&gt;
	    String orderId = (String) workItem.getParameter(&amp;quot;orderId&amp;quot;);&lt;br /&gt;
	    Map&amp;lt;String, Object&amp;gt; result = new HashMap&amp;lt;String,Object&amp;gt;();&lt;br /&gt;
	    result.put(&amp;quot;orderTotal&amp;quot;,&amp;quot;12000&amp;quot;);&lt;br /&gt;
	    System.out.println(&amp;quot;Retriving order information (mock service) for orderId:&amp;quot; + orderId);&lt;br /&gt;
	    &lt;br /&gt;
	    manager.completeWorkItem(workItem.getId(), result);&lt;br /&gt;
	  }&lt;br /&gt;
&lt;br /&gt;
	  public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {&lt;br /&gt;
	    // Do nothing, notifications cannot be aborted&lt;br /&gt;
	  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ProcessTest.java===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package com.nobleprog;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
&lt;br /&gt;
import com.nobleprog.GetOrderWorkItemHandler;&lt;br /&gt;
&lt;br /&gt;
import org.jbpm.test.JbpmJUnitBaseTestCase;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.kie.api.runtime.KieSession;&lt;br /&gt;
import org.kie.api.runtime.manager.RuntimeEngine;&lt;br /&gt;
import org.kie.api.runtime.process.ProcessInstance;&lt;br /&gt;
&lt;br /&gt;
public class ProcessTest extends JbpmJUnitBaseTestCase {&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void testProcess() throws Exception {&lt;br /&gt;
	String[] processes = new String[]{&amp;quot;IssueInvoice.bpmn2&amp;quot;};&lt;br /&gt;
	createRuntimeManager(processes);&lt;br /&gt;
	RuntimeEngine engine = getRuntimeEngine(null);&lt;br /&gt;
	KieSession ksession = engine.getKieSession();&lt;br /&gt;
	&lt;br /&gt;
	ksession.getWorkItemManager().registerWorkItemHandler(&amp;quot;GetOrder&amp;quot;, new GetOrderWorkItemHandler());&lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;
        params.put(&amp;quot;orderId&amp;quot;, &amp;quot;15&amp;quot;);&lt;br /&gt;
        ProcessInstance processInstance = ksession.startProcess(&amp;quot;com.sample.test&amp;quot;, params);&lt;br /&gt;
&lt;br /&gt;
	assertProcessInstanceCompleted(processInstance.getId(), ksession);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Eclipse with Workbench==&lt;br /&gt;
* Eclipse -&amp;gt; KIE Workbench&lt;br /&gt;
* KIE Workbench -&amp;gt; Eclipse&lt;br /&gt;
** [KIE] Authoring/Administration&lt;br /&gt;
** [Eclipse] Right click/Team/Pull&lt;/div&gt;</summary>
		<author><name>Fstachecki</name></author>
	</entry>
</feed>