diff --git a/libraries2/pom.xml b/libraries2/pom.xml
new file mode 100644
index 0000000000..84f19b359d
--- /dev/null
+++ b/libraries2/pom.xml
@@ -0,0 +1,43 @@
+
+
+
+ 4.0.0
+ libraries2
+ libraries2
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ 6.0.0.Final
+
+
+
+
+ jboss-public-repository-group
+ JBoss Public Repository Group
+ http://repository.jboss.org/nexus/content/groups/public/
+
+ true
+ never
+
+
+ true
+ daily
+
+
+
+
+
+
+ org.jbpm
+ jbpm-test
+ ${jbpm.version}
+
+
+
diff --git a/libraries2/src/main/java/com/baeldung/jbpm/WorkflowProcessMain.java b/libraries2/src/main/java/com/baeldung/jbpm/WorkflowProcessMain.java
new file mode 100644
index 0000000000..8e54ff892e
--- /dev/null
+++ b/libraries2/src/main/java/com/baeldung/jbpm/WorkflowProcessMain.java
@@ -0,0 +1,19 @@
+package com.baeldung.jbpm;
+
+import org.kie.api.runtime.manager.Context;
+import org.kie.internal.runtime.manager.context.EmptyContext;
+
+import com.baeldung.jbpm.engine.WorkflowEngine;
+import com.baeldung.jbpm.engine.WorkflowEngineImpl;
+
+public class WorkflowProcessMain {
+
+ public static void main(String[] args) {
+ WorkflowEngine workflowEngine = new WorkflowEngineImpl();
+ String processId = "com.baeldung.bpmn.helloworld";
+ String kbaseId = "kbase";
+ String persistenceUnit = "org.jbpm.persistence.jpa";
+ Context initialContext = EmptyContext.get();
+ workflowEngine.runjBPMEngineForProcess(processId, initialContext, kbaseId, persistenceUnit);
+ }
+}
\ No newline at end of file
diff --git a/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngine.java b/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngine.java
new file mode 100644
index 0000000000..b47a4cc8c1
--- /dev/null
+++ b/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngine.java
@@ -0,0 +1,10 @@
+package com.baeldung.jbpm.engine;
+
+import org.kie.api.runtime.manager.Context;
+import org.kie.api.runtime.process.ProcessInstance;
+
+public interface WorkflowEngine {
+
+ public ProcessInstance runjBPMEngineForProcess(String processId, Context initialContext, String kbaseId, String persistenceUnit);
+
+}
diff --git a/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngineImpl.java b/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngineImpl.java
new file mode 100644
index 0000000000..7871241bef
--- /dev/null
+++ b/libraries2/src/main/java/com/baeldung/jbpm/engine/WorkflowEngineImpl.java
@@ -0,0 +1,66 @@
+package com.baeldung.jbpm.engine;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.jbpm.test.JBPMHelper;
+import org.kie.api.KieBase;
+import org.kie.api.KieServices;
+import org.kie.api.runtime.KieContainer;
+import org.kie.api.runtime.KieSession;
+import org.kie.api.runtime.manager.Context;
+import org.kie.api.runtime.manager.RuntimeEngine;
+import org.kie.api.runtime.manager.RuntimeEnvironment;
+import org.kie.api.runtime.manager.RuntimeEnvironmentBuilder;
+import org.kie.api.runtime.manager.RuntimeManager;
+import org.kie.api.runtime.manager.RuntimeManagerFactory;
+import org.kie.api.runtime.process.ProcessInstance;
+
+public class WorkflowEngineImpl implements WorkflowEngine {
+
+ @Override
+ public ProcessInstance runjBPMEngineForProcess(String processId, Context initialContext, String kbaseId, String persistenceUnit) {
+ RuntimeManager manager = null;
+ RuntimeEngine engine = null;
+ ProcessInstance pInstance = null;
+ try {
+ KieBase kbase = getKieBase(kbaseId);
+ manager = createJBPMRuntimeManager(kbase, persistenceUnit);
+ engine = manager.getRuntimeEngine(initialContext);
+ pInstance = executeProcessInstance(processId, manager, initialContext, engine);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ if (manager != null && engine != null)
+ manager.disposeRuntimeEngine(engine);
+ System.exit(0);
+ }
+ return pInstance;
+ }
+
+ private ProcessInstance executeProcessInstance(String processId, RuntimeManager manager, Context initialContext, RuntimeEngine engine) {
+ KieSession ksession = engine.getKieSession();
+ ProcessInstance pInstance = ksession.startProcess(processId);
+ return pInstance;
+ }
+
+ private KieBase getKieBase(String kbaseId) {
+ KieServices ks = KieServices.Factory.get();
+ KieContainer kContainer = ks.getKieClasspathContainer();
+ KieBase kbase = kContainer.getKieBase(kbaseId);
+ return kbase;
+ }
+
+ private RuntimeManager createJBPMRuntimeManager(KieBase kbase, String persistenceUnit) {
+ JBPMHelper.startH2Server();
+ JBPMHelper.setupDataSource();
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnit);
+ RuntimeEnvironmentBuilder runtimeEnvironmentBuilder = RuntimeEnvironmentBuilder.Factory.get()
+ .newDefaultBuilder();
+ RuntimeEnvironment runtimeEnvironment = runtimeEnvironmentBuilder.entityManagerFactory(emf)
+ .knowledgeBase(kbase)
+ .get();
+ return RuntimeManagerFactory.Factory.get()
+ .newSingletonRuntimeManager(runtimeEnvironment);
+ }
+}
diff --git a/libraries2/src/main/resources/META-INF/kmodule.xml b/libraries2/src/main/resources/META-INF/kmodule.xml
new file mode 100644
index 0000000000..1b9ce1ce71
--- /dev/null
+++ b/libraries2/src/main/resources/META-INF/kmodule.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/libraries2/src/main/resources/com/baeldung/process/helloworld.bpmn b/libraries2/src/main/resources/com/baeldung/process/helloworld.bpmn
new file mode 100644
index 0000000000..30813b2057
--- /dev/null
+++ b/libraries2/src/main/resources/com/baeldung/process/helloworld.bpmn
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries2/src/test/java/com/baeldung/jbpm/WorkflowEngineIntegrationTest.java b/libraries2/src/test/java/com/baeldung/jbpm/WorkflowEngineIntegrationTest.java
new file mode 100644
index 0000000000..ded46d7639
--- /dev/null
+++ b/libraries2/src/test/java/com/baeldung/jbpm/WorkflowEngineIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.jbpm;
+
+import org.jbpm.test.JbpmJUnitBaseTestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.kie.api.runtime.KieSession;
+import org.kie.api.runtime.manager.RuntimeEngine;
+import org.kie.api.runtime.manager.RuntimeManager;
+import org.kie.api.runtime.process.ProcessInstance;
+import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext;
+
+public class WorkflowEngineIntegrationTest extends JbpmJUnitBaseTestCase {
+
+ private String[] triggeredNodesArray = { "Start", "HelloWorld", "End" };
+ private RuntimeManager manager = null;
+ private RuntimeEngine runtimeEngine = null;
+ private KieSession ksession = null;
+ private ProcessInstance processInstance = null;
+
+ @Before
+ public void setup() {
+ manager = createRuntimeManager(Strategy.SINGLETON, "manager", "com/baeldung/process/helloworld.bpmn");
+ runtimeEngine = getRuntimeEngine(ProcessInstanceIdContext.get());
+ ksession = runtimeEngine.getKieSession();
+ processInstance = ksession.startProcess("com.baeldung.bpmn.helloworld");
+ }
+
+ @After
+ public void cleanup() {
+ manager.disposeRuntimeEngine(runtimeEngine);
+ }
+
+ @Test
+ public void givenProcessInstance_whenExecutionCompleted_thenVerifyNodesExecutionOrder() {
+ assertNodeTriggered(processInstance.getId(), triggeredNodesArray);
+ }
+
+ @Test
+ public void givenProcessInstance_whenExecutionCompleted_thenVerifyKnowledgeSessionId() {
+ int ksessionID = ksession.getId();
+ runtimeEngine = getRuntimeEngine(ProcessInstanceIdContext.get(processInstance.getId()));
+ ksession = runtimeEngine.getKieSession();
+ assertEquals(ksessionID, ksession.getId());
+ }
+
+ @Test
+ public void givenProcessInstance_whenExecutionCompleted_thenVerifyProcessInstanceStatus() {
+ assertProcessInstanceCompleted(processInstance.getId(), ksession);
+ assertTrue("ProcessInstance completed with status 2", processInstance.getState() == 2);
+ }
+}
diff --git a/pom.xml b/pom.xml
index a832d6156f..e785f1461f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -480,6 +480,7 @@
libraries
+ libraries2
libraries-data
libraries-apache-commons
libraries-security