This is an automated email from the ASF dual-hosted git repository.

egonzalez pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 3fe438b6ed [incubator-kie-kogito-runtimes-3167] Merging output from 
parallel blocks on parallel gateway sometimes doesn't work (#3875)
3fe438b6ed is described below

commit 3fe438b6ed851df77f4184a4d56bdfb9534cb4cf
Author: Enrique <[email protected]>
AuthorDate: Mon Apr 14 15:17:26 2025 +0200

    [incubator-kie-kogito-runtimes-3167] Merging output from parallel blocks on 
parallel gateway sometimes doesn't work (#3875)
---
 .../filesystem/FileSystemProcessInstances.java     |   10 +-
 .../filesystem/FileSystemProcessInstancesTest.java |    2 +-
 .../kogito/infinispan/CacheProcessInstances.java   |    6 +-
 .../persistence/jdbc/JDBCProcessInstances.java     |   19 +-
 .../jdbc/AbstractProcessInstancesIT.java           |    2 +
 .../kogito/mongodb/MongoDBProcessInstances.java    |   11 +-
 .../PersistentProcessInstancesWithLockIT.java      |    2 +
 .../postgresql/PostgresqlProcessInstances.java     |   11 +-
 .../postgresql/PostgresqlProcessInstancesIT.java   |    2 +
 .../services/uow/ProcessInstanceWorkUnit.java      |   90 --
 .../services/uow/DefaultUnitOfWorkManagerTest.java |    6 +-
 .../process/impl/AbstractProcessInstance.java      |  304 +++--
 .../lock/ProcessInstanceAtomicLockStrategy.java    |  126 ++
 .../impl/lock/ProcessInstanceLockStrategy.java     |   16 +-
 .../process/impl/lock/WorkflowAtomicExecutor.java  |   16 +-
 .../process/impl/AbstractProcessInstanceTest.java  |   14 +-
 .../kie/kogito/codegen/tests/CandidateData.java    |   71 ++
 .../org/kie/kogito/codegen/tests/GatewayIT.java    |   54 +-
 .../java/org/kie/kogito/codegen/tests/Offer.java   |   27 +-
 .../kie/kogito/codegen/tests/SignalEventIT.java    |    2 -
 .../src/test/resources/gateway/MultipleJoin.bpmn2  | 1249 ++++++++++++++++++++
 .../persistence/kafka/KafkaProcessInstances.java   |   11 +-
 .../kafka/KafkaProcessInstancesTest.java           |    6 +-
 .../java/org/kie/kogito/it/KafkaPersistenceIT.java |    2 +
 24 files changed, 1776 insertions(+), 283 deletions(-)

diff --git 
a/addons/common/persistence/filesystem/src/main/java/org/kie/kogito/persistence/filesystem/FileSystemProcessInstances.java
 
b/addons/common/persistence/filesystem/src/main/java/org/kie/kogito/persistence/filesystem/FileSystemProcessInstances.java
index 9fa8e5fb0c..9b83abaaf8 100644
--- 
a/addons/common/persistence/filesystem/src/main/java/org/kie/kogito/persistence/filesystem/FileSystemProcessInstances.java
+++ 
b/addons/common/persistence/filesystem/src/main/java/org/kie/kogito/persistence/filesystem/FileSystemProcessInstances.java
@@ -68,12 +68,15 @@ public class FileSystemProcessInstances implements 
MutableProcessInstances {
     @Override
     public Optional findById(String id, ProcessInstanceReadMode mode) {
         Path processInstanceStorage = Paths.get(storage.toString(), id);
-
         if (Files.notExists(processInstanceStorage)) {
             return Optional.empty();
         }
         byte[] data = readBytesFromFile(processInstanceStorage);
-        return Optional.of(marshaller.unmarshallProcessInstance(data, process, 
mode));
+        AbstractProcessInstance pi = (AbstractProcessInstance) 
marshaller.unmarshallProcessInstance(data, process, mode);
+        if (pi != null && !ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+            disconnect(processInstanceStorage, pi);
+        }
+        return Optional.of(pi);
     }
 
     @Override
@@ -149,7 +152,8 @@ public class FileSystemProcessInstances implements 
MutableProcessInstances {
 
     protected void disconnect(Path processInstanceStorage, ProcessInstance 
instance) {
         Supplier<byte[]> supplier = () -> 
readBytesFromFile(processInstanceStorage);
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 
     public String getMetadata(Path file, String key) {
diff --git 
a/addons/common/persistence/filesystem/src/test/java/org/kie/persistence/filesystem/FileSystemProcessInstancesTest.java
 
b/addons/common/persistence/filesystem/src/test/java/org/kie/persistence/filesystem/FileSystemProcessInstancesTest.java
index 2106596a22..96a64e14aa 100644
--- 
a/addons/common/persistence/filesystem/src/test/java/org/kie/persistence/filesystem/FileSystemProcessInstancesTest.java
+++ 
b/addons/common/persistence/filesystem/src/test/java/org/kie/persistence/filesystem/FileSystemProcessInstancesTest.java
@@ -170,7 +170,7 @@ class FileSystemProcessInstancesTest {
         assertThat(processInstance.description()).isEqualTo("User Task");
 
         FileSystemProcessInstances fileSystemBasedStorage = 
(FileSystemProcessInstances) process.instances();
-        verify(fileSystemBasedStorage).update(any(), any());
+        verify(fileSystemBasedStorage).create(any(), any());
 
         String testVar = (String) processInstance.variables().get("test");
         assertThat(testVar).isEqualTo("test");
diff --git 
a/addons/common/persistence/infinispan/src/main/java/org/kie/kogito/infinispan/CacheProcessInstances.java
 
b/addons/common/persistence/infinispan/src/main/java/org/kie/kogito/infinispan/CacheProcessInstances.java
index 903c5bb63d..bb0e7db738 100644
--- 
a/addons/common/persistence/infinispan/src/main/java/org/kie/kogito/infinispan/CacheProcessInstances.java
+++ 
b/addons/common/persistence/infinispan/src/main/java/org/kie/kogito/infinispan/CacheProcessInstances.java
@@ -148,12 +148,14 @@ public class CacheProcessInstances implements 
MutableProcessInstances {
             ((AbstractProcessInstance) 
instance).setVersion(versionedCache.getVersion());
             return versionedCache.getValue();
         };
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 
     private void reload(String id, ProcessInstance instance) {
         Supplier<byte[]> supplier = () -> cache.get(id);
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(supplier));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 
     @Override
diff --git 
a/addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/JDBCProcessInstances.java
 
b/addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/JDBCProcessInstances.java
index 4463406180..527db523c6 100644
--- 
a/addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/JDBCProcessInstances.java
+++ 
b/addons/common/persistence/jdbc/src/main/java/org/kie/kogito/persistence/jdbc/JDBCProcessInstances.java
@@ -108,13 +108,25 @@ public class JDBCProcessInstances implements 
MutableProcessInstances {
     @Override
     public Optional<ProcessInstance<?>> findById(String id, 
ProcessInstanceReadMode mode) {
         LOGGER.debug("Find process instance id: {}, mode: {}", id, mode);
-        return repository.findByIdInternal(process.id(), process.version(), 
UUID.fromString(id)).map(r -> unmarshall(r, mode));
+        return repository.findByIdInternal(process.id(), process.version(), 
UUID.fromString(id)).map(r -> {
+            AbstractProcessInstance pi = (AbstractProcessInstance) 
unmarshall(r, mode);
+            if (!ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+                disconnect(pi);
+            }
+            return pi;
+        });
     }
 
     @Override
     public Optional<ProcessInstance<?>> findByBusinessKey(String businessKey, 
ProcessInstanceReadMode mode) {
         LOGGER.debug("Find process instance using business Key : {}", 
businessKey);
-        return repository.findByBusinessKey(process.id(), process.version(), 
businessKey).map(r -> unmarshall(r, mode));
+        return repository.findByBusinessKey(process.id(), process.version(), 
businessKey).map(r -> {
+            AbstractProcessInstance pi = (AbstractProcessInstance) 
unmarshall(r, mode);
+            if (!ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+                disconnect(pi);
+            }
+            return pi;
+        });
     }
 
     @Override
@@ -136,10 +148,11 @@ public class JDBCProcessInstances implements 
MutableProcessInstances {
     }
 
     private void disconnect(ProcessInstance<?> instance) {
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(() -> {
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> {
             Repository.Record r = repository.findByIdInternal(process.id(), 
process.version(), UUID.fromString(instance.id())).orElseThrow();
             ((AbstractProcessInstance<?>) instance).setVersion(r.getVersion());
             return r.getPayload();
         }));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 }
diff --git 
a/addons/common/persistence/jdbc/src/test/java/org/kie/persistence/jdbc/AbstractProcessInstancesIT.java
 
b/addons/common/persistence/jdbc/src/test/java/org/kie/persistence/jdbc/AbstractProcessInstancesIT.java
index 2f4355beff..ccdeb65d40 100644
--- 
a/addons/common/persistence/jdbc/src/test/java/org/kie/persistence/jdbc/AbstractProcessInstancesIT.java
+++ 
b/addons/common/persistence/jdbc/src/test/java/org/kie/persistence/jdbc/AbstractProcessInstancesIT.java
@@ -37,6 +37,7 @@ import org.kie.kogito.process.WorkItem;
 import org.kie.kogito.process.bpmn2.BpmnProcess;
 import org.kie.kogito.process.bpmn2.BpmnProcessInstance;
 import org.kie.kogito.process.bpmn2.BpmnVariables;
+import org.kie.kogito.process.impl.AbstractProcessInstance;
 import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
 import org.kie.kogito.process.impl.StaticProcessConfig;
 import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
@@ -201,6 +202,7 @@ abstract class AbstractProcessInstancesIT {
         BpmnProcessInstance instanceTwo = (BpmnProcessInstance) foundOne.get();
         assertThat(instanceOne.version()).isEqualTo(lock() ? 1L : 0);
         assertThat(instanceTwo.version()).isEqualTo(lock() ? 1L : 0);
+        ((AbstractProcessInstance) instanceTwo).startDate(); // force reload
         instanceOne.updateVariables(BpmnVariables.create(singletonMap("s", 
"test")));
         try {
             BpmnVariables testvar = BpmnVariables.create(singletonMap("ss", 
"test"));
diff --git 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
index 21d8aa61db..048d44a95f 100644
--- 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
+++ 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
@@ -78,7 +78,13 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
 
     @Override
     public Optional<ProcessInstance<T>> findById(String id, 
ProcessInstanceReadMode mode) {
-        return find(id).map(piDoc -> unmarshall(piDoc, mode));
+        return find(id).map(piDoc -> {
+            AbstractProcessInstance pi = (AbstractProcessInstance) 
unmarshall(piDoc, mode);
+            if (!ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+                reloadProcessInstance(pi, id);
+            }
+            return pi;
+        });
     }
 
     @Override
@@ -168,10 +174,11 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
     }
 
     private void reloadProcessInstance(ProcessInstance<T> instance, String id) 
{
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(() -> 
find(id).map(reloaded -> {
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> 
find(id).map(reloaded -> {
             setVersion(instance, reloaded.getLong(VERSION));
             return reloaded.toJson().getBytes();
         }).orElseThrow(() -> new IllegalArgumentException("process instance id 
" + id + " does not exists in mongodb"))));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 
     private static void setVersion(ProcessInstance<?> instance, Long version) {
diff --git 
a/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/PersistentProcessInstancesWithLockIT.java
 
b/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/PersistentProcessInstancesWithLockIT.java
index d97213e97a..8016adde6c 100644
--- 
a/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/PersistentProcessInstancesWithLockIT.java
+++ 
b/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/PersistentProcessInstancesWithLockIT.java
@@ -27,6 +27,7 @@ import org.kie.kogito.process.ProcessInstance;
 import org.kie.kogito.process.bpmn2.BpmnProcess;
 import org.kie.kogito.process.bpmn2.BpmnProcessInstance;
 import org.kie.kogito.process.bpmn2.BpmnVariables;
+import org.kie.kogito.process.impl.AbstractProcessInstance;
 import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
 import org.kie.kogito.process.impl.StaticProcessConfig;
 import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
@@ -62,6 +63,7 @@ class PersistentProcessInstancesWithLockIT extends TestHelper 
{
         BpmnProcessInstance instanceTwo = (BpmnProcessInstance) foundOne.get();
         assertThat(instanceOne.version()).isOne();
         assertThat(instanceTwo.version()).isOne();
+        ((AbstractProcessInstance) instanceTwo).startDate(); // force reload
         
instanceOne.updateVariables(BpmnVariables.create(Collections.singletonMap("s", 
"test")));
         try {
             BpmnVariables testvar = 
BpmnVariables.create(Collections.singletonMap("ss", "test"));
diff --git 
a/addons/common/persistence/postgresql/src/main/java/org/kie/kogito/persistence/postgresql/PostgresqlProcessInstances.java
 
b/addons/common/persistence/postgresql/src/main/java/org/kie/kogito/persistence/postgresql/PostgresqlProcessInstances.java
index c0a0bb388b..3ce5faa29c 100644
--- 
a/addons/common/persistence/postgresql/src/main/java/org/kie/kogito/persistence/postgresql/PostgresqlProcessInstances.java
+++ 
b/addons/common/persistence/postgresql/src/main/java/org/kie/kogito/persistence/postgresql/PostgresqlProcessInstances.java
@@ -113,7 +113,13 @@ public class PostgresqlProcessInstances implements 
MutableProcessInstances {
 
     @Override
     public Optional<ProcessInstance> findById(String id, 
ProcessInstanceReadMode mode) {
-        return findByIdInternal(id).map(r -> unmarshall(r, mode));
+        return findByIdInternal(id).map(r -> {
+            AbstractProcessInstance pi = (AbstractProcessInstance) 
unmarshall(r, mode);
+            if (!ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+                disconnect(pi);
+            }
+            return pi;
+        });
     }
 
     @Override
@@ -142,10 +148,11 @@ public class PostgresqlProcessInstances implements 
MutableProcessInstances {
     }
 
     private void disconnect(ProcessInstance instance) {
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(() -> 
findByIdInternal(instance.id()).map(r -> {
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> 
findByIdInternal(instance.id()).map(r -> {
             ((AbstractProcessInstance) 
instance).setVersion(r.getLong(VERSION));
             return r.getBuffer(PAYLOAD).getBytes();
         }).orElseThrow()));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 
     private boolean insertInternal(String id, byte[] payload) {
diff --git 
a/addons/common/persistence/postgresql/src/test/java/org/kie/persistence/postgresql/PostgresqlProcessInstancesIT.java
 
b/addons/common/persistence/postgresql/src/test/java/org/kie/persistence/postgresql/PostgresqlProcessInstancesIT.java
index ea22618429..064eacb974 100644
--- 
a/addons/common/persistence/postgresql/src/test/java/org/kie/persistence/postgresql/PostgresqlProcessInstancesIT.java
+++ 
b/addons/common/persistence/postgresql/src/test/java/org/kie/persistence/postgresql/PostgresqlProcessInstancesIT.java
@@ -37,6 +37,7 @@ import org.kie.kogito.process.WorkItem;
 import org.kie.kogito.process.bpmn2.BpmnProcess;
 import org.kie.kogito.process.bpmn2.BpmnProcessInstance;
 import org.kie.kogito.process.bpmn2.BpmnVariables;
+import org.kie.kogito.process.impl.AbstractProcessInstance;
 import org.kie.kogito.process.impl.DefaultWorkItemHandlerConfig;
 import org.kie.kogito.process.impl.StaticProcessConfig;
 import org.kie.kogito.process.workitems.impl.DefaultKogitoWorkItemHandler;
@@ -198,6 +199,7 @@ class PostgresqlProcessInstancesIT {
         BpmnProcessInstance instanceTwo = (BpmnProcessInstance) foundOne.get();
         assertThat(instanceOne.version()).isEqualTo(lock() ? 1L : 0);
         assertThat(instanceTwo.version()).isEqualTo(lock() ? 1L : 0);
+        ((AbstractProcessInstance) instanceTwo).startDate(); // force reload
         
instanceOne.updateVariables(BpmnVariables.create(Collections.singletonMap("s", 
"test")));
         try {
             BpmnVariables testvar = 
BpmnVariables.create(Collections.singletonMap("ss", "test"));
diff --git 
a/api/kogito-services/src/main/java/org/kie/kogito/services/uow/ProcessInstanceWorkUnit.java
 
b/api/kogito-services/src/main/java/org/kie/kogito/services/uow/ProcessInstanceWorkUnit.java
deleted file mode 100644
index 818e2df6f6..0000000000
--- 
a/api/kogito-services/src/main/java/org/kie/kogito/services/uow/ProcessInstanceWorkUnit.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.kie.kogito.services.uow;
-
-import java.util.function.Consumer;
-
-import org.kie.kogito.process.ProcessInstance;
-import org.kie.kogito.uow.WorkUnit;
-
-public class ProcessInstanceWorkUnit<T> implements 
WorkUnit<ProcessInstance<T>> {
-
-    private ProcessInstance<T> data;
-    private Consumer<Object> action;
-    private Consumer<Object> compensation;
-
-    public ProcessInstanceWorkUnit(ProcessInstance<T> data, Consumer<Object> 
action) {
-        this.data = data;
-        this.action = action;
-    }
-
-    public ProcessInstanceWorkUnit(ProcessInstance<T> data, Consumer<Object> 
action, Consumer<Object> compensation) {
-        this.data = data;
-        this.action = action;
-        this.compensation = compensation;
-    }
-
-    @Override
-    public ProcessInstance<T> data() {
-        return data;
-    }
-
-    @Override
-    public void perform() {
-        action.accept(data());
-    }
-
-    @Override
-    public void abort() {
-        if (compensation != null) {
-            compensation.accept(data());
-        }
-    }
-
-    @Override
-    public Integer priority() {
-        return WorkUnit.HIGH_PRIORITY;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((data == null) ? 0 : data.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ProcessInstanceWorkUnit<T> other = (ProcessInstanceWorkUnit) obj;
-        if (action == null) {
-            if (other.action != null)
-                return false;
-        } else if (!action.equals(other.action))
-            return false;
-        return true;
-    }
-
-}
diff --git 
a/api/kogito-services/src/test/java/org/kie/kogito/services/uow/DefaultUnitOfWorkManagerTest.java
 
b/api/kogito-services/src/test/java/org/kie/kogito/services/uow/DefaultUnitOfWorkManagerTest.java
index 2d9254c067..04e50ea33f 100644
--- 
a/api/kogito-services/src/test/java/org/kie/kogito/services/uow/DefaultUnitOfWorkManagerTest.java
+++ 
b/api/kogito-services/src/test/java/org/kie/kogito/services/uow/DefaultUnitOfWorkManagerTest.java
@@ -136,12 +136,12 @@ public class DefaultUnitOfWorkManagerTest {
 
         final AtomicInteger picounter = new AtomicInteger(0);
 
-        BaseWorkUnit dummyWork = new BaseWorkUnit(counter, (d) -> 
((AtomicInteger) d).incrementAndGet());
-        ProcessInstanceWorkUnit<?> piWork = new 
ProcessInstanceWorkUnit<>(null, (d) -> picounter.set(counter.get()));
+        BaseWorkUnit<AtomicInteger> dummyWork = new 
BaseWorkUnit<AtomicInteger>(counter, d -> d.incrementAndGet());
+        BaseWorkUnit<AtomicInteger> piWork = new 
BaseWorkUnit<AtomicInteger>(picounter, d -> d.set(counter.get()));
         unit.start();
         // make sure that dummyWork is first added and then piWork
-        unit.intercept(dummyWork);
         unit.intercept(piWork);
+        unit.intercept(dummyWork);
         unit.end();
 
         // after execution the pi should be 0 as this is the initial value of 
counter which will indicate
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
index 2c49befddf..11aba6da58 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
@@ -71,8 +71,9 @@ import org.kie.kogito.process.Signal;
 import org.kie.kogito.process.WorkItem;
 import org.kie.kogito.process.flexible.AdHocFragment;
 import org.kie.kogito.process.flexible.Milestone;
+import org.kie.kogito.process.impl.lock.ProcessInstanceAtomicLockStrategy;
+import org.kie.kogito.process.impl.lock.ProcessInstanceLockStrategy;
 import org.kie.kogito.process.workitems.InternalKogitoWorkItem;
-import org.kie.kogito.services.uow.ProcessInstanceWorkUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,6 +106,8 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     private Optional<CorrelationInstance> correlationInstance = 
Optional.empty();
 
+    private ProcessInstanceLockStrategy processInstanceLockStrategy;
+
     public AbstractProcessInstance(AbstractProcess<T> process, T variables, 
ProcessRuntime rt) {
         this(process, variables, null, rt);
     }
@@ -118,6 +121,7 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         this.rt = (InternalProcessRuntime) rt;
         this.variables = variables;
         this.removed = new AtomicBoolean(false);
+        this.processInstanceLockStrategy = 
ProcessInstanceAtomicLockStrategy.instance();
         setCorrelationKey(businessKey);
 
         Map<String, Object> map = bind(variables);
@@ -148,6 +152,7 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         syncProcessInstance((WorkflowProcessInstance) wpi);
         unbind(variables, processInstance.getVariables());
         this.removed = new AtomicBoolean(false);
+        this.processInstanceLockStrategy = 
ProcessInstanceAtomicLockStrategy.instance();
     }
 
     public AbstractProcessInstance(AbstractProcess<T> process, T variables, 
ProcessRuntime rt, org.kie.api.runtime.process.WorkflowProcessInstance wpi) {
@@ -157,6 +162,7 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         syncProcessInstance((WorkflowProcessInstance) wpi);
         reconnect();
         this.removed = new AtomicBoolean(false);
+        this.processInstanceLockStrategy = 
ProcessInstanceAtomicLockStrategy.instance();
     }
 
     protected void reconnect() {
@@ -231,8 +237,11 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         processInstance.wrap(this);
     }
 
-    public void 
internalRemoveProcessInstance(Consumer<AbstractProcessInstance<?>> 
reloadSupplier) {
+    public void internalSetReloadSupplier(Consumer<AbstractProcessInstance<?>> 
reloadSupplier) {
         this.reloadSupplier = reloadSupplier;
+    }
+
+    public void internalRemoveProcessInstance() {
         if (processInstance == null) {
             return;
         }
@@ -265,44 +274,45 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public void start(String trigger, String referenceId, Map<String, 
List<String>> headers) {
-        if (this.status != KogitoProcessInstance.STATE_PENDING) {
-            throw new IllegalStateException("Impossible to start process 
instance that already has started");
-        }
-        this.status = KogitoProcessInstance.STATE_ACTIVE;
-
-        if (referenceId != null) {
-            processInstance.setReferenceId(referenceId);
-        }
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            if (this.status != KogitoProcessInstance.STATE_PENDING) {
+                throw new IllegalStateException("Impossible to start process 
instance that already has started");
+            }
+            this.status = KogitoProcessInstance.STATE_ACTIVE;
 
-        if (headers != null) {
-            this.processInstance.setHeaders(headers);
-        }
+            if (referenceId != null) {
+                processInstance.setReferenceId(referenceId);
+            }
 
-        
getProcessRuntime().getProcessInstanceManager().setLock(((MutableProcessInstances<T>)
 process.instances()).lock());
-        
getProcessRuntime().getProcessInstanceManager().addProcessInstance(this.processInstance);
-        this.id = processInstance.getStringId();
-        addCompletionEventListener();
-        addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).create(id, this));
-        KogitoProcessInstance kogitoProcessInstance = 
getProcessRuntime().getKogitoProcessRuntime().startProcessInstance(this.id, 
trigger);
-        if (kogitoProcessInstance.getState() != STATE_ABORTED && 
kogitoProcessInstance.getState() != STATE_COMPLETED) {
-            addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).update(pi.id(), pi));
-        }
-        unbind(variables, kogitoProcessInstance.getVariables());
-        if (this.processInstance != null) {
-            this.status = this.processInstance.getState();
-        }
-    }
+            if (headers != null) {
+                this.processInstance.setHeaders(headers);
+            }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    protected void addToUnitOfWork(Consumer<ProcessInstance<T>> action) {
-        
getProcessRuntime().getUnitOfWorkManager().currentUnitOfWork().intercept(new 
ProcessInstanceWorkUnit(this, action));
+            
getProcessRuntime().getProcessInstanceManager().setLock(((MutableProcessInstances<T>)
 process.instances()).lock());
+            
getProcessRuntime().getProcessInstanceManager().addProcessInstance(this.processInstance);
+            this.id = processInstance.getStringId();
+            addCompletionEventListener();
+            ((MutableProcessInstances<T>) process.instances()).create(id, 
this);
+            KogitoProcessInstance kogitoProcessInstance = 
getProcessRuntime().getKogitoProcessRuntime().startProcessInstance(this.id, 
trigger);
+            if (kogitoProcessInstance.getState() != STATE_ABORTED && 
kogitoProcessInstance.getState() != STATE_COMPLETED) {
+                ((MutableProcessInstances<T>) 
process.instances()).update(this.id(), this);
+            }
+            unbind(variables, kogitoProcessInstance.getVariables());
+            if (this.processInstance != null) {
+                this.status = this.processInstance.getState();
+            }
+            return null;
+        });
     }
 
     @Override
     public void abort() {
-        String pid = processInstance().getStringId();
-        
getProcessRuntime().getKogitoProcessRuntime().abortProcessInstance(pid);
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            String pid = processInstance().getStringId();
+            
getProcessRuntime().getKogitoProcessRuntime().abortProcessInstance(pid);
+            removeOnFinish();
+            return null;
+        });
     }
 
     private InternalProcessRuntime getProcessRuntime() {
@@ -315,11 +325,14 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public <S> void send(Signal<S> signal) {
-        if (signal.referenceId() != null) {
-            processInstance().setReferenceId(signal.referenceId());
-        }
-        processInstance().signalEvent(signal.channel(), signal.payload());
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            if (signal.referenceId() != null) {
+                processInstance().setReferenceId(signal.referenceId());
+            }
+            processInstance().signalEvent(signal.channel(), signal.payload());
+            removeOnFinish();
+            return null;
+        });
     }
 
     @Override
@@ -354,7 +367,9 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public Date startDate() {
-        return this.processInstance != null ? 
this.processInstance.getStartDate() : null;
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance().getStartDate();
+        });
     }
 
     @Override
@@ -379,20 +394,23 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
     }
 
     private T updateVariables(Map<String, Object> map) {
-        for (Entry<String, Object> entry : map.entrySet()) {
-            processInstance().setVariable(entry.getKey(), entry.getValue());
-        }
-        addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).update(pi.id(), pi));
-        return variables;
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            for (Entry<String, Object> entry : map.entrySet()) {
+                processInstance().setVariable(entry.getKey(), 
entry.getValue());
+            }
+            ((MutableProcessInstances<T>) 
process.instances()).update(this.id(), this);
+            return variables;
+        });
     }
 
     @Override
     public Optional<ProcessError> error() {
-        if (this.status == STATE_ERROR) {
-            return Optional.of(this.processError != null ? this.processError : 
buildProcessError());
-        }
-
-        return Optional.empty();
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            if (this.status == STATE_ERROR) {
+                return Optional.of(this.processError != null ? 
this.processError : buildProcessError());
+            }
+            return Optional.empty();
+        });
     }
 
     @Override
@@ -412,29 +430,42 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public void startFrom(String nodeId, String referenceId, Map<String, 
List<String>> headers) {
-        processInstance.setStartDate(new Date());
-        processInstance.setState(STATE_ACTIVE);
-        
getProcessRuntime().getProcessInstanceManager().addProcessInstance(this.processInstance);
-        addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).create(id, this));
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            processInstance.setStartDate(new Date());
+            processInstance.setState(STATE_ACTIVE);
+            
getProcessRuntime().getProcessInstanceManager().addProcessInstance(this.processInstance);
 
-        this.id = processInstance.getStringId();
-        addCompletionEventListener();
-        if (referenceId != null) {
-            processInstance.setReferenceId(referenceId);
-        }
-        if (headers != null) {
-            this.processInstance.setHeaders(headers);
-        }
+            this.id = processInstance.getStringId();
 
-        triggerNode(nodeId);
-        unbind(variables, processInstance.getVariables());
-        if (processInstance != null) {
-            this.status = processInstance.getState();
-        }
+            addCompletionEventListener();
+            if (referenceId != null) {
+                processInstance.setReferenceId(referenceId);
+            }
+            if (headers != null) {
+                this.processInstance.setHeaders(headers);
+            }
+
+            internalTriggerNode(nodeId);
+
+            unbind(variables, processInstance.getVariables());
+            if (processInstance() != null) {
+                this.status = processInstance.getState();
+            }
+            ((MutableProcessInstances<T>) process.instances()).create(id, 
this);
+            return null;
+        });
     }
 
     @Override
     public void triggerNode(String nodeId) {
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            internalTriggerNode(nodeId);
+            ((MutableProcessInstances<T>) process.instances()).update(id, 
this);
+            return null;
+        });
+    }
+
+    private void internalTriggerNode(String nodeId) {
         WorkflowProcessInstance wfpi = processInstance();
         RuleFlowProcess rfp = ((RuleFlowProcess) wfpi.getProcess());
 
@@ -445,33 +476,37 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
             throw new NodeNotFoundException(this.id, nodeId);
         }
         nodeInstance.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
-
-        addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).update(pi.id(), pi));
     }
 
     @Override
     public void cancelNodeInstance(String nodeInstanceId) {
-        NodeInstance nodeInstance = processInstance()
-                .getNodeInstances(true)
-                .stream()
-                .filter(ni -> ni.getStringId().equals(nodeInstanceId))
-                .findFirst()
-                .orElseThrow(() -> new NodeInstanceNotFoundException(this.id, 
nodeInstanceId));
-
-        nodeInstance.cancel();
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            NodeInstance nodeInstance = processInstance()
+                    .getNodeInstances(true)
+                    .stream()
+                    .filter(ni -> ni.getStringId().equals(nodeInstanceId))
+                    .findFirst()
+                    .orElseThrow(() -> new 
NodeInstanceNotFoundException(this.id, nodeInstanceId));
+
+            nodeInstance.cancel();
+            removeOnFinish();
+            return null;
+        });
     }
 
     @Override
     public void retriggerNodeInstance(String nodeInstanceId) {
-        NodeInstance nodeInstance = processInstance()
-                .getNodeInstances(true)
-                .stream()
-                .filter(ni -> ni.getStringId().equals(nodeInstanceId))
-                .findFirst()
-                .orElseThrow(() -> new NodeInstanceNotFoundException(this.id, 
nodeInstanceId));
-        ((NodeInstanceImpl) nodeInstance).retrigger(true);
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            NodeInstance nodeInstance = processInstance()
+                    .getNodeInstances(true)
+                    .stream()
+                    .filter(ni -> ni.getStringId().equals(nodeInstanceId))
+                    .findFirst()
+                    .orElseThrow(() -> new 
NodeInstanceNotFoundException(this.id, nodeInstanceId));
+            ((NodeInstanceImpl) nodeInstance).retrigger(true);
+            removeOnFinish();
+            return null;
+        });
     }
 
     protected WorkflowProcessInstance processInstance() {
@@ -483,25 +518,28 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
                 reconnect();
             }
         }
-
         return this.processInstance;
     }
 
     @Override
     public Collection<KogitoNodeInstance> 
findNodes(Predicate<KogitoNodeInstance> predicate) {
-        return processInstance().getKogitoNodeInstances(predicate, true);
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance().getKogitoNodeInstances(predicate, true);
+        });
     }
 
     @Override
     public WorkItem workItem(String workItemId, Policy... policies) {
-        return processInstance().getNodeInstances(true).stream()
-                .filter(WorkItemNodeInstance.class::isInstance)
-                .map(WorkItemNodeInstance.class::cast)
-                .filter(w -> enforceException(w.getWorkItem(), policies))
-                .filter(ni -> ni.getWorkItemId().equals(workItemId))
-                .map(this::toBaseWorkItem)
-                .findAny()
-                .orElseThrow(() -> new WorkItemNotFoundException("Work item 
with id " + workItemId + " was not found in process instance " + id(), 
workItemId));
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance().getNodeInstances(true).stream()
+                    .filter(WorkItemNodeInstance.class::isInstance)
+                    .map(WorkItemNodeInstance.class::cast)
+                    .filter(w -> enforceException(w.getWorkItem(), policies))
+                    .filter(ni -> ni.getWorkItemId().equals(workItemId))
+                    .map(this::toBaseWorkItem)
+                    .findAny()
+                    .orElseThrow(() -> new WorkItemNotFoundException("Work 
item with id " + workItemId + " was not found in process instance " + id(), 
workItemId));
+        });
     }
 
     private boolean enforceException(KogitoWorkItem kogitoWorkItem, Policy... 
policies) {
@@ -516,13 +554,15 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public List<WorkItem> workItems(Predicate<KogitoNodeInstance> p, Policy... 
policies) {
-        return processInstance().getNodeInstances(true).stream()
-                .filter(p::test)
-                .filter(WorkItemNodeInstance.class::isInstance)
-                .map(WorkItemNodeInstance.class::cast)
-                .filter(w -> enforce(w.getWorkItem(), policies))
-                .map(this::toBaseWorkItem)
-                .toList();
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance().getNodeInstances(true).stream()
+                    .filter(p::test)
+                    .filter(WorkItemNodeInstance.class::isInstance)
+                    .map(WorkItemNodeInstance.class::cast)
+                    .filter(w -> enforce(w.getWorkItem(), policies))
+                    .map(this::toBaseWorkItem)
+                    .toList();
+        });
     }
 
     private WorkItem toBaseWorkItem(WorkItemNodeInstance workItemNodeInstance) 
{
@@ -552,31 +592,42 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public void completeWorkItem(String id, Map<String, Object> variables, 
Policy... policies) {
-        syncWorkItems();
-        
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().completeWorkItem(id,
 variables, policies);
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            syncWorkItems();
+            
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().completeWorkItem(id,
 variables, policies);
+            removeOnFinish();
+            return null;
+        });
     }
 
     @Override
     public <R> R updateWorkItem(String id, Function<KogitoWorkItem, R> 
updater, Policy... policies) {
-        syncWorkItems();
-        R result = 
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().updateWorkItem(id,
 updater, policies);
-        addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).update(pi.id(), pi));
-        return result;
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            syncWorkItems();
+            R result = 
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().updateWorkItem(id,
 updater, policies);
+            ((MutableProcessInstances<T>) 
process.instances()).update(this.id(), this);
+            return result;
+        });
     }
 
     @Override
     public void abortWorkItem(String id, Policy... policies) {
-        syncWorkItems();
-        
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().abortWorkItem(id,
 policies);
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            syncWorkItems();
+            
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().abortWorkItem(id,
 policies);
+            removeOnFinish();
+            return null;
+        });
     }
 
     @Override
     public void transitionWorkItem(String id, WorkItemTransition transition) {
-        syncWorkItems();
-        
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().transitionWorkItem(id,
 transition);
-        removeOnFinish();
+        processInstanceLockStrategy.executeOperation(id, () -> {
+            syncWorkItems();
+            
getProcessRuntime().getKogitoProcessRuntime().getKogitoWorkItemManager().transitionWorkItem(id,
 transition);
+            removeOnFinish();
+            return null;
+        });
     }
 
     private void syncWorkItems() {
@@ -589,17 +640,23 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
 
     @Override
     public Set<EventDescription<?>> events() {
-        return processInstance().getEventDescriptions();
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance().getEventDescriptions();
+        });
     }
 
     @Override
     public Collection<Milestone> milestones() {
-        return processInstance.milestones();
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance.milestones();
+        });
     }
 
     @Override
     public Collection<AdHocFragment> adHocFragments() {
-        return processInstance.adHocFragments();
+        return processInstanceLockStrategy.executeOperation(id, () -> {
+            return processInstance.adHocFragments();
+        });
     }
 
     protected void removeOnFinish() {
@@ -608,7 +665,7 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
             syncProcessInstance(processInstance);
             remove();
         } else {
-            addToUnitOfWork(pi -> ((MutableProcessInstances<T>) 
process.instances()).update(pi.id(), pi));
+            ((MutableProcessInstances<T>) 
process.instances()).update(this.id(), this);
         }
         unbind(this.variables, processInstance().getVariables());
         this.status = processInstance.getState();
@@ -619,11 +676,8 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
             //already removed
             return;
         }
-        correlationInstance.map(CorrelationInstance::getCorrelation)
-                .ifPresent(c -> addToUnitOfWork(pi -> 
process.correlations().delete(c)));
-        addToUnitOfWork(pi -> {
-            ((MutableProcessInstances<T>) process.instances()).remove(pi.id());
-        });
+        
correlationInstance.map(CorrelationInstance::getCorrelation).ifPresent(c -> 
process.correlations().delete(c));
+        ((MutableProcessInstances<T>) process.instances()).remove(this.id());
     }
 
     // this must be overridden at compile time
@@ -792,4 +846,4 @@ public abstract class AbstractProcessInstance<T extends 
Model> implements Proces
         }
 
     }
-}
+}
\ No newline at end of file
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceAtomicLockStrategy.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceAtomicLockStrategy.java
new file mode 100644
index 0000000000..ad78e2d581
--- /dev/null
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceAtomicLockStrategy.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.process.impl.lock;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProcessInstanceAtomicLockStrategy implements 
ProcessInstanceLockStrategy {
+
+    private class ProcessInstanceLockHolder {
+        Integer counter;
+        ReentrantLock lock;
+
+        public ProcessInstanceLockHolder() {
+            counter = 0;
+            lock = new ReentrantLock();
+        }
+
+        void lock() {
+            lock.lock();
+        }
+
+        void unlock() {
+            lock.unlock();
+        }
+
+        boolean isReferenced() {
+            return counter > 0;
+        }
+
+        boolean isHeldByCurrentThread() {
+            return lock.isHeldByCurrentThread();
+        }
+
+        public void addReference() {
+            counter++;
+        }
+
+        public void removeReference() {
+            counter--;
+        }
+    }
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(ProcessInstanceAtomicLockStrategy.class);
+
+    private static ProcessInstanceAtomicLockStrategy INSTANCE;
+
+    private Map<String, ProcessInstanceLockHolder> locks = new 
ConcurrentHashMap<>();
+
+    @Override
+    public <T> T executeOperation(String processInstanceId, 
WorkflowAtomicExecutor<T> executor) {
+        // This is a bit tricky. To avoid resource memory leak of the 
reentrant lock and proper reuse we need to compute how many times
+        // the lock has being referenced. We avoid that way to compute 
incorrectly when to release it.
+        // compute and compute if present are thread safe and atomic to the 
bucket being computed meaning that the creation and obtaining this will rise
+        // the proper counter
+
+        ProcessInstanceLockHolder processInstanceLockHolder = 
locks.compute(processInstanceId, (pid, holder) -> {
+            ProcessInstanceLockHolder newHolder = holder;
+            if (newHolder == null) {
+                newHolder = new ProcessInstanceLockHolder();
+            }
+            newHolder.addReference();
+            LOG.trace("Creating lock {} from list as none is waiting for it by 
{}", newHolder.lock, pid);
+            return newHolder;
+        });
+
+        // at this points this is a safe ask as if we invoked prior to this 
point the hold it will always return
+        // properly
+        boolean alreadyAcquired = 
processInstanceLockHolder.isHeldByCurrentThread();
+        try {
+            if (!alreadyAcquired) {
+                LOG.trace("About to acquire lock for {}", processInstanceId);
+            }
+            processInstanceLockHolder.lock();
+            if (!alreadyAcquired) {
+                LOG.trace("Lock acquired for {}", processInstanceId);
+            }
+            return executor.execute();
+        } finally {
+            processInstanceLockHolder.unlock();
+            if (!alreadyAcquired) {
+                LOG.trace("Lock released for {}", processInstanceId);
+            }
+
+            // evaluate atomically if the lock is still in used before 
removing it.
+            locks.computeIfPresent(processInstanceId, (pid, holder) -> {
+                holder.removeReference();
+                if (holder.isReferenced()) {
+                    return holder;
+                } else {
+                    LOG.trace("Removing lock {} from list as none is waiting 
for it by {}", holder.lock, pid);
+                    return null;
+                }
+            });
+        }
+
+    }
+
+    public static synchronized ProcessInstanceLockStrategy instance() {
+        if (INSTANCE == null) {
+            INSTANCE = new ProcessInstanceAtomicLockStrategy();
+        }
+        return INSTANCE;
+    }
+
+}
diff --git 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceLockStrategy.java
similarity index 55%
copy from 
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
copy to 
jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceLockStrategy.java
index 85f4d6c6ec..02f8350866 100644
--- 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/ProcessInstanceLockStrategy.java
@@ -16,20 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.it;
+package org.kie.kogito.process.impl.lock;
 
-import org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource;
+public interface ProcessInstanceLockStrategy {
 
-import io.quarkus.test.common.QuarkusTestResource;
-import io.quarkus.test.common.ResourceArg;
-import io.quarkus.test.junit.QuarkusIntegrationTest;
-
-import static 
org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource.KOGITO_KAFKA_TOPICS;
-
-@QuarkusIntegrationTest
-@QuarkusTestResource(value = KafkaQuarkusTestResource.class, initArgs = { 
@ResourceArg(name = KOGITO_KAFKA_TOPICS, value = KafkaPersistenceIT.TOPICS) })
-public class KafkaPersistenceIT extends PersistenceTest {
-
-    public static final String TOPICS = "kogito.process";
+    <T> T executeOperation(String processInstanceId, WorkflowAtomicExecutor<T> 
empty);
 
 }
diff --git 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/WorkflowAtomicExecutor.java
similarity index 55%
copy from 
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
copy to 
jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/WorkflowAtomicExecutor.java
index 85f4d6c6ec..f875e1ef97 100644
--- 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/lock/WorkflowAtomicExecutor.java
@@ -16,20 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.it;
+package org.kie.kogito.process.impl.lock;
 
-import org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource;
+public interface WorkflowAtomicExecutor<T> {
 
-import io.quarkus.test.common.QuarkusTestResource;
-import io.quarkus.test.common.ResourceArg;
-import io.quarkus.test.junit.QuarkusIntegrationTest;
-
-import static 
org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource.KOGITO_KAFKA_TOPICS;
-
-@QuarkusIntegrationTest
-@QuarkusTestResource(value = KafkaQuarkusTestResource.class, initArgs = { 
@ResourceArg(name = KOGITO_KAFKA_TOPICS, value = KafkaPersistenceIT.TOPICS) })
-public class KafkaPersistenceIT extends PersistenceTest {
-
-    public static final String TOPICS = "kogito.process";
+    T execute();
 
 }
diff --git 
a/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessInstanceTest.java
 
b/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessInstanceTest.java
index cb88221760..f896af55af 100644
--- 
a/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessInstanceTest.java
+++ 
b/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessInstanceTest.java
@@ -20,6 +20,7 @@ package org.kie.kogito.process.impl;
 
 import java.util.Arrays;
 import java.util.Map;
+import java.util.UUID;
 
 import org.jbpm.process.instance.InternalProcessRuntime;
 import org.jbpm.process.instance.ProcessInstanceManager;
@@ -33,6 +34,7 @@ import org.kie.api.definition.process.Process;
 import org.kie.kogito.Model;
 import org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
 import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime;
+import org.kie.kogito.process.MutableProcessInstances;
 import org.kie.kogito.uow.UnitOfWork;
 import org.kie.kogito.uow.UnitOfWorkManager;
 import org.mockito.Mock;
@@ -59,6 +61,9 @@ public class AbstractProcessInstanceTest {
     @Mock
     private UnitOfWork unitOfWork;
 
+    @Mock
+    private MutableProcessInstances instances;
+
     private AbstractProcessInstance<TestModel> processInstance;
 
     @SuppressWarnings("unchecked")
@@ -69,6 +74,7 @@ public class AbstractProcessInstanceTest {
         AbstractProcess<TestModel> process = mock(AbstractProcess.class);
         Process piProcess = mock(Process.class);
         when(process.process()).thenReturn(piProcess);
+        when(process.instances()).thenReturn(instances);
         when(process.get()).thenReturn(piProcess);
         InternalProcessRuntime pr = mock(InternalProcessRuntime.class);
         when(pr.createProcessInstance(any(), any(), any())).thenReturn(wpi);
@@ -78,7 +84,7 @@ public class AbstractProcessInstanceTest {
         KogitoProcessRuntime kogitoProcessRuntime = 
mock(KogitoProcessRuntime.class);
         when(pr.getKogitoProcessRuntime()).thenReturn(kogitoProcessRuntime);
         when(unitOfWorkManager.currentUnitOfWork()).thenReturn(unitOfWork);
-
+        when(wpi.getStringId()).thenReturn(UUID.randomUUID().toString());
         processInstance = new TestProcessInstance(process, new TestModel(), 
pr);
     }
 
@@ -86,7 +92,7 @@ public class AbstractProcessInstanceTest {
     public void testCreateProcessInstance() {
 
         
assertThat(processInstance.status()).isEqualTo(KogitoProcessInstance.STATE_PENDING);
-        assertThat(processInstance.id()).isNull();
+        assertThat(processInstance.id()).isNotNull();
         assertThat(processInstance.businessKey()).isNull();
 
         verify(pim, never()).addProcessInstance(any());
@@ -99,7 +105,7 @@ public class AbstractProcessInstanceTest {
         processInstance.startFrom(NODE_ID);
 
         verify(nodeInstance).trigger(null, Node.CONNECTION_DEFAULT_TYPE);
-        verify(unitOfWork, times(2)).intercept(any());
+        verify(unitOfWork, times(0)).intercept(any());
     }
 
     @Test
@@ -109,7 +115,7 @@ public class AbstractProcessInstanceTest {
         processInstance.triggerNode(NODE_ID);
 
         verify(nodeInstance).trigger(null, Node.CONNECTION_DEFAULT_TYPE);
-        verify(unitOfWork).intercept(any());
+        verify(unitOfWork, times(0)).intercept(any());
     }
 
     private NodeInstance givenExistingNode(String nodeId) {
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/CandidateData.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/CandidateData.java
new file mode 100644
index 0000000000..2d78f865b0
--- /dev/null
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/CandidateData.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.kie.kogito.codegen.tests;
+
+import java.util.List;
+
+public class CandidateData {
+
+    private String email;
+    private int experience;
+    private List<String> skills;
+    private String name;
+    private String lastName;
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public void setExperience(int experience) {
+        this.experience = experience;
+    }
+
+    public void setSkills(List<String> skills) {
+        this.skills = skills;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public int getExperience() {
+        return experience;
+    }
+
+    public List<String> getSkills() {
+        return skills;
+    }
+
+    public String getFullName() {
+        return name;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+}
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/GatewayIT.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/GatewayIT.java
index e2ee4d3997..a485c918b3 100644
--- 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/GatewayIT.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/GatewayIT.java
@@ -18,30 +18,33 @@
  */
 package org.kie.kogito.codegen.tests;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.junit.jupiter.api.Test;
 import org.kie.kogito.Application;
 import org.kie.kogito.Model;
+import org.kie.kogito.auth.IdentityProviders;
 import org.kie.kogito.codegen.AbstractCodegenIT;
+import 
org.kie.kogito.jbpm.usertask.handler.UserTaskKogitoWorkItemHandlerProcessListener;
 import org.kie.kogito.process.Process;
 import org.kie.kogito.process.ProcessInstance;
 import org.kie.kogito.process.Processes;
 import org.kie.kogito.process.impl.Sig;
+import org.kie.kogito.usertask.UserTaskConfig;
+import org.kie.kogito.usertask.UserTaskInstance;
+import org.kie.kogito.usertask.UserTasks;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.kie.kogito.test.utils.ProcessInstancesTestUtils.assertEmpty;
+import static 
org.kie.kogito.usertask.impl.lifecycle.DefaultUserTaskLifeCycle.COMPLETE;
 
 public class GatewayIT extends AbstractCodegenIT {
 
     @Test
     public void testEventBasedGatewayWithData() throws Exception {
-        Map<TYPE, List<String>> resourcesTypeMap = new HashMap<>();
-        resourcesTypeMap.put(TYPE.PROCESS, 
Collections.singletonList("gateway/EventBasedSplit.bpmn2"));
-        Application app = generateCode(resourcesTypeMap);
+        Application app = 
generateCodeProcessesOnly("gateway/EventBasedSplit.bpmn2");
         assertThat(app).isNotNull();
 
         Process<? extends Model> p = 
app.get(Processes.class).processById("EventBasedSplit");
@@ -80,4 +83,45 @@ public class GatewayIT extends AbstractCodegenIT {
         assertEmpty(p.instances());
     }
 
+    @Test
+    public void testMultipleJoin() throws Exception {
+        Application app = 
generateCodeProcessesOnly("gateway/MultipleJoin.bpmn2");
+        assertThat(app).isNotNull();
+        // we wired user tasks and processes
+        
app.config().get(UserTaskConfig.class).userTaskEventListeners().listeners().add(new
 UserTaskKogitoWorkItemHandlerProcessListener(app.get(Processes.class)));
+
+        Process<? extends Model> p = 
app.get(Processes.class).processById("hiring_join");
+
+        Model m = p.createModel();
+
+        CandidateData data = new CandidateData();
+        data.setEmail("[email protected]");
+        data.setExperience(10);
+        data.setSkills(List.of("programmer", "soft"));
+        data.setName("minor");
+        data.setLastName("last name");
+
+        m.update(Map.of("candidateData", data));
+        ProcessInstance<?> processInstance = p.createInstance(m);
+        processInstance.start();
+
+        
assertThat(processInstance.status()).isEqualTo(ProcessInstance.STATE_ACTIVE);
+
+        UserTasks userTasks = app.get(UserTasks.class);
+
+        Awaitility.given().until(() -> {
+            return 
userTasks.instances().findByIdentity(IdentityProviders.of("mary")).size() == 1;
+        });
+
+        List<UserTaskInstance> userTaskList = 
userTasks.instances().findByIdentity(IdentityProviders.of("mary"));
+        assertThat(userTaskList).hasSize(1);
+
+        UserTaskInstance userTaskInstance_1 = userTaskList.get(0);
+        Offer offer = new Offer();
+        offer.setCategory("custom category");
+        offer.setSalary(50000);
+        userTaskInstance_1.transition(COMPLETE, Map.of("Offer", offer), 
IdentityProviders.of("mary"));
+
+        
assertThat(processInstance.status()).isEqualTo(ProcessInstance.STATE_ACTIVE);
+    }
 }
diff --git 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/Offer.java
similarity index 56%
copy from 
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
copy to 
kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/Offer.java
index 85f4d6c6ec..e1ee2b476d 100644
--- 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/Offer.java
@@ -16,20 +16,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.kie.kogito.it;
+package org.kie.kogito.codegen.tests;
 
-import org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource;
+public class Offer {
 
-import io.quarkus.test.common.QuarkusTestResource;
-import io.quarkus.test.common.ResourceArg;
-import io.quarkus.test.junit.QuarkusIntegrationTest;
+    private String category;
+    private Integer salary;
 
-import static 
org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource.KOGITO_KAFKA_TOPICS;
+    public String getCategory() {
+        return category;
+    }
 
-@QuarkusIntegrationTest
-@QuarkusTestResource(value = KafkaQuarkusTestResource.class, initArgs = { 
@ResourceArg(name = KOGITO_KAFKA_TOPICS, value = KafkaPersistenceIT.TOPICS) })
-public class KafkaPersistenceIT extends PersistenceTest {
+    public void setCategory(String category) {
+        this.category = category;
+    }
 
-    public static final String TOPICS = "kogito.process";
+    public Integer getSalary() {
+        return salary;
+    }
+
+    public void setSalary(int salary) {
+        this.salary = salary;
+    }
 
 }
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/SignalEventIT.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/SignalEventIT.java
index da2c3bec80..16cdab003d 100644
--- 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/SignalEventIT.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/SignalEventIT.java
@@ -247,8 +247,6 @@ public class SignalEventIT extends AbstractCodegenIT {
         assertThat(result.toMap()).hasSize(2).containsKey("x");
         assertThat(result.toMap().get("x")).isEqualTo("test");
 
-        // since the unit of work is not ended yet there is still instance 
visible
-        assertOne(p.instances());
         uow.end();
         // after unit of work is ended instance is gone from the list
         assertEmpty(p.instances());
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/resources/gateway/MultipleJoin.bpmn2
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/resources/gateway/MultipleJoin.bpmn2
new file mode 100644
index 0000000000..6a7c95b69d
--- /dev/null
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/resources/gateway/MultipleJoin.bpmn2
@@ -0,0 +1,1249 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<bpmn2:definitions
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL";
+  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI";
+  xmlns:bpsim="http://www.bpsim.org/schemas/1.0";
+  xmlns:dc="http://www.omg.org/spec/DD/20100524/DC";
+  xmlns:di="http://www.omg.org/spec/DD/20100524/DI";
+  xmlns:drools="http://www.jboss.org/drools";
+  id="_nYr90OiwED2JqoGgi3DJyQ"
+  xsi:schemaLocation="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 http://www.omg.org/spec/DD/20100524/DC DC.xsd 
http://www.omg.org/spec/DD/20100524/DI DI.xsd "
+  exporter="jBPM Process Modeler"
+  exporterVersion="2.0"
+  targetNamespace="http://www.omg.org/bpmn20";
+>
+  <bpmn2:itemDefinition id="_hr_approvalItem" structureRef="Boolean" />
+  <bpmn2:itemDefinition id="_it_approvalItem" structureRef="Boolean" />
+  <bpmn2:itemDefinition id="_candidateDataItem" 
structureRef="org.kie.kogito.codegen.tests.CandidateData" />
+  <bpmn2:itemDefinition id="_offerItem" 
structureRef="org.kie.kogito.codegen.tests.Offer" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_PriorityInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_CommentInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_DescriptionInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_CreatedByInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_GroupIdInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_ContentInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition
+    id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_NotStartedReassignInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition
+    id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_NotCompletedReassignInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_NotStartedNotifyInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition
+    id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_NotCompletedNotifyInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition
+    id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_candidateInputXItem"
+    structureRef="org.kie.kogito.codegen.tests.CandidateData"
+  />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerInputXItem" 
structureRef="org.kie.kogito.codegen.tests.Offer" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveInputXItem" 
structureRef="Boolean" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveOutputXItem" 
structureRef="Boolean" />
+  <bpmn2:itemDefinition 
id="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerOutputXItem" 
structureRef="org.kie.kogito.codegen.tests.Offer" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_PriorityInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_CommentInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_DescriptionInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_CreatedByInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_GroupIdInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_ContentInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition
+    id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_NotStartedReassignInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition
+    id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_NotCompletedReassignInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_NotStartedNotifyInputXItem" 
structureRef="Object" />
+  <bpmn2:itemDefinition
+    id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_NotCompletedNotifyInputXItem"
+    structureRef="Object"
+  />
+  <bpmn2:itemDefinition
+    id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_candidateInputXItem"
+    structureRef="org.kie.kogito.codegen.tests.CandidateData"
+  />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_offerInputXItem" 
structureRef="org.kie.kogito.codegen.tests.Offer" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveInputXItem" 
structureRef="Boolean" />
+  <bpmn2:itemDefinition 
id="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveOutputXItem" 
structureRef="Boolean" />
+  <bpmn2:itemDefinition
+    id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputXItem"
+    structureRef="java.lang.String"
+  />
+  <bpmn2:itemDefinition
+    id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputXItem"
+    structureRef="java.lang.String"
+  />
+  <bpmn2:itemDefinition 
id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputXItem" 
structureRef="java.lang.String" />
+  <bpmn2:itemDefinition
+    id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_decisionInputXItem"
+    structureRef="java.lang.String"
+  />
+  <bpmn2:itemDefinition
+    id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_CandidateDataInputXItem"
+    structureRef="org.kie.kogito.codegen.tests.CandidateData"
+  />
+  <bpmn2:itemDefinition 
id="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_OfferOutputXItem" 
structureRef="org.kie.kogito.codegen.tests.Offer" />
+  <bpmn2:collaboration id="_587AEFB0-DDDE-4C24-ABC7-D30B833F8E9A" 
name="Default Collaboration">
+    <bpmn2:participant id="_8463CFE6-3FB6-45FA-8631-41AAC298A458" name="Pool 
Participant" processRef="hiring" />
+  </bpmn2:collaboration>
+  <bpmn2:process
+    id="hiring_join"
+    drools:packageName="org.kie.kogito.codegen.tests"
+    drools:version="1.0"
+    drools:adHoc="false"
+    name="hiring_join"
+    isExecutable="true"
+    processType="Public"
+  >
+    <bpmn2:extensionElements>
+      <drools:import name="org.kie.kogito.codegen.tests.CandidateData" />
+      <drools:import name="org.kie.kogito.codegen.tests.Offer" />
+    </bpmn2:extensionElements>
+    <bpmn2:property id="hr_approval" itemSubjectRef="_hr_approvalItem" 
name="hr_approval">
+      <bpmn2:extensionElements>
+        <drools:metaData name="customTags">
+          <drools:metaValue><![CDATA[internal]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:property>
+    <bpmn2:property id="it_approval" itemSubjectRef="_it_approvalItem" 
name="it_approval">
+      <bpmn2:extensionElements>
+        <drools:metaData name="customTags">
+          <drools:metaValue><![CDATA[internal]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:property>
+    <bpmn2:property id="candidateData" itemSubjectRef="_candidateDataItem" 
name="candidateData">
+      <bpmn2:extensionElements>
+        <drools:metaData name="customTags">
+          <drools:metaValue><![CDATA[input]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:property>
+    <bpmn2:property id="offer" itemSubjectRef="_offerItem" name="offer">
+      <bpmn2:extensionElements>
+        <drools:metaData name="customTags">
+          <drools:metaValue><![CDATA[output]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:property>
+    <bpmn2:sequenceFlow
+      id="_AFE232D5-9172-4279-8398-44BF84489B46"
+      sourceRef="_8D7D5941-E108-4158-8514-312860B509DB"
+      targetRef="_2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+    />
+    <bpmn2:sequenceFlow
+      id="_2530A25C-48A5-494C-86A1-ED39F94265A0"
+      sourceRef="_5D4415F3-B226-4641-8397-DA9714446AEE"
+      targetRef="_2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+    />
+    <bpmn2:sequenceFlow
+      id="_25AD4191-61BF-48D4-92D7-B8543813E021"
+      sourceRef="_2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+      targetRef="_8D7D5941-E108-4158-8514-312860B509DB"
+    />
+    <bpmn2:sequenceFlow
+      id="_800CBA8E-67E6-42A5-A075-C6B564E1AE7D"
+      sourceRef="_2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+      targetRef="_5D4415F3-B226-4641-8397-DA9714446AEE"
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="isAutoConnection.target">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_7DDA574A-C220-4FEF-9784-22EF8052EDEC"
+      sourceRef="_940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+      targetRef="_6CE52250-BCEE-485C-8AE4-F6CACF2EF5A1"
+    />
+    <bpmn2:sequenceFlow
+      id="_9C33F5EA-89C7-4ED1-B3C2-CF18DE439AF5"
+      sourceRef="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+      targetRef="_57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+    />
+    <bpmn2:sequenceFlow
+      id="_527D3164-4989-4D2C-B80B-9BA9D4C8FB89"
+      sourceRef="_4B7FF147-F096-435B-8CAF-48318EF786B0"
+      targetRef="_457DC13A-0AEC-4390-A860-5CCFFB67B366"
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="isAutoConnection.target">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_94172225-E124-4F14-98DA-C3D62C11254A"
+      sourceRef="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+      targetRef="_4B7FF147-F096-435B-8CAF-48318EF786B0"
+    />
+    <bpmn2:sequenceFlow
+      id="_C6E61C53-FD35-4347-B69E-30AA93AE4404"
+      sourceRef="_A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+      targetRef="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+    >
+      <bpmn2:conditionExpression
+        xsi:type="bpmn2:tFormalExpression"
+        language="http://www.java.com/java";
+      ><![CDATA[return candidateData.getExperience() < 1 || 
candidateData.getSkills().size() == 0;]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_59F9A0E6-7F9C-43A9-8920-5B40A91169E6"
+      sourceRef="_A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+      targetRef="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+    />
+    <bpmn2:sequenceFlow
+      id="_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E"
+      sourceRef="_B9662806-84F3-4444-AD62-4790CDA7C85D"
+      targetRef="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+    />
+    <bpmn2:sequenceFlow
+      id="_B11455DE-F77A-4251-A85B-4C66636E3CD9"
+      sourceRef="_B9662806-84F3-4444-AD62-4790CDA7C85D"
+      targetRef="_940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+    >
+      <bpmn2:conditionExpression
+        xsi:type="bpmn2:tFormalExpression"
+        language="http://www.java.com/java";
+      ><![CDATA[return hr_approval && 
it_approval;]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_5334FFDC-1FCB-47E6-8085-36DC9A3D17B9"
+      sourceRef="_834B21EF-9229-44F8-A5DB-D96EBB39A347"
+      targetRef="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+    />
+    <bpmn2:sequenceFlow
+      id="_5162ABF0-DD2E-4BDC-9A46-DDCFCB010287"
+      sourceRef="_5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+      targetRef="_A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+    />
+    <bpmn2:sequenceFlow
+      id="_AE65A7EC-5499-43FF-9429-EA56E9AD7DFD"
+      sourceRef="_2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+      targetRef="_5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="isAutoConnection.target">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_C62F7EFB-A009-450A-81C7-57D36F0DF766"
+      sourceRef="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E"
+      targetRef="_B9662806-84F3-4444-AD62-4790CDA7C85D"
+    />
+    <bpmn2:sequenceFlow
+      id="_A76C6603-0406-423C-940B-3403948DCA1F"
+      sourceRef="_B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+      targetRef="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E"
+    />
+    <bpmn2:sequenceFlow
+      id="_ACEE7578-B7D2-4EDF-B104-9ECF3DD8A383"
+      sourceRef="_57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+      targetRef="_B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+    />
+    <bpmn2:sequenceFlow
+      id="_4085EC5F-5D62-430A-AF40-1FD1DDAC6797"
+      sourceRef="_1639F738-45F3-4CD6-A80E-CCEBAA605D56"
+      targetRef="_2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="isAutoConnection.target">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow
+      id="_7B41F971-C74D-4036-8A5E-EFF81C37986A"
+      sourceRef="_116F3C54-A10E-4952-9E08-1CACE74CED0B"
+      targetRef="_834B21EF-9229-44F8-A5DB-D96EBB39A347"
+    />
+    <bpmn2:parallelGateway id="_2C62E6FB-64E7-485E-8F02-6368EC7C42A3" 
gatewayDirection="Converging">
+      <bpmn2:incoming>_2530A25C-48A5-494C-86A1-ED39F94265A0</bpmn2:incoming>
+      <bpmn2:incoming>_AFE232D5-9172-4279-8398-44BF84489B46</bpmn2:incoming>
+      <bpmn2:outgoing>_AE65A7EC-5499-43FF-9429-EA56E9AD7DFD</bpmn2:outgoing>
+    </bpmn2:parallelGateway>
+    <bpmn2:scriptTask id="_8D7D5941-E108-4158-8514-312860B509DB" name="async2" 
scriptFormat="http://www.java.com/java";>
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[async2]]></drools:metaValue>
+        </drools:metaData>
+        <drools:metaData name="customAsync">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_25AD4191-61BF-48D4-92D7-B8543813E021</bpmn2:incoming>
+      <bpmn2:outgoing>_AFE232D5-9172-4279-8398-44BF84489B46</bpmn2:outgoing>
+      <bpmn2:script
+      >System.out.println("[" + Thread.currentThread().getName() + "] PARALLEL 
2, procid=" + kcontext.getProcessInstance().getId());</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:scriptTask id="_5D4415F3-B226-4641-8397-DA9714446AEE" name="async1" 
scriptFormat="http://www.java.com/java";>
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[async1]]></drools:metaValue>
+        </drools:metaData>
+        <drools:metaData name="customAsync">
+          <drools:metaValue><![CDATA[true]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_800CBA8E-67E6-42A5-A075-C6B564E1AE7D</bpmn2:incoming>
+      <bpmn2:outgoing>_2530A25C-48A5-494C-86A1-ED39F94265A0</bpmn2:outgoing>
+      <bpmn2:script
+      >System.out.println("[" + Thread.currentThread().getName() + "] PARALLEL 
1, procid=" + kcontext.getProcessInstance().getId());
+</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:parallelGateway id="_2C5073FB-03B9-40A0-AEDF-D72E12FADCB3" 
gatewayDirection="Diverging">
+      <bpmn2:incoming>_4085EC5F-5D62-430A-AF40-1FD1DDAC6797</bpmn2:incoming>
+      <bpmn2:outgoing>_800CBA8E-67E6-42A5-A075-C6B564E1AE7D</bpmn2:outgoing>
+      <bpmn2:outgoing>_25AD4191-61BF-48D4-92D7-B8543813E021</bpmn2:outgoing>
+    </bpmn2:parallelGateway>
+    <bpmn2:scriptTask
+      id="_940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+      name="Send Offer to Candidate"
+      scriptFormat="http://www.java.com/java";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Send Offer to 
Candidate]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_B11455DE-F77A-4251-A85B-4C66636E3CD9</bpmn2:incoming>
+      <bpmn2:outgoing>_7DDA574A-C220-4FEF-9784-22EF8052EDEC</bpmn2:outgoing>
+      <bpmn2:script>System.out.println("###################################");
+System.out.println("To: " + candidateData.getEmail());
+System.out.println("Subject: Congratulations you made it!");
+System.out.println("Dear " + candidateData.getFullName() + ", we are happy to 
tell you that you've successfully went through the hiring process. You'll find 
the final Offer details in attached.");
+System.out.println("Job Category: " + offer.getCategory());
+System.out.println("Base salary: " + offer.getSalary());
+System.out.println("###################################");</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:scriptTask
+      id="_57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+      name="Log Offer"
+      scriptFormat="http://www.java.com/java";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Log Offer]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_9C33F5EA-89C7-4ED1-B3C2-CF18DE439AF5</bpmn2:incoming>
+      <bpmn2:outgoing>_ACEE7578-B7D2-4EDF-B104-9ECF3DD8A383</bpmn2:outgoing>
+      <bpmn2:script>System.out.println("###################################");
+System.out.println("Generated offer for candidate: " + 
candidateData.getFullName());
+System.out.println("Job Category: " + offer.getCategory());
+System.out.println("Base salary: " + offer.getSalary());
+System.out.println("###################################");</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:endEvent id="_6CE52250-BCEE-485C-8AE4-F6CACF2EF5A1">
+      <bpmn2:incoming>_7DDA574A-C220-4FEF-9784-22EF8052EDEC</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:userTask
+      id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+      name="Generate base offer"
+      implementation="http://www.jboss.org/drools/dmn";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Generate base offer]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_59F9A0E6-7F9C-43A9-8920-5B40A91169E6</bpmn2:incoming>
+      <bpmn2:outgoing>_9C33F5EA-89C7-4ED1-B3C2-CF18DE439AF5</bpmn2:outgoing>
+      <bpmn2:ioSpecification>
+        <bpmn2:dataInput
+          id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputX"
+          drools:dtype="java.lang.String"
+          
itemSubjectRef="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputXItem"
+          name="fileName"
+        />
+        <bpmn2:dataInput
+          id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputX"
+          drools:dtype="java.lang.String"
+          
itemSubjectRef="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputXItem"
+          name="namespace"
+        />
+        <bpmn2:dataInput
+          id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputX"
+          drools:dtype="java.lang.String"
+          
itemSubjectRef="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputXItem"
+          name="model"
+        />
+        <bpmn2:dataInput
+          id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_CandidateDataInputX"
+          drools:dtype="org.kie.kogito.codegen.tests.CandidateData"
+          
itemSubjectRef="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_CandidateDataInputXItem"
+          name="CandidateData"
+        />
+        <bpmn2:dataOutput
+          id="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_OfferOutputX"
+          drools:dtype="org.kie.kogito.codegen.tests.Offer"
+          
itemSubjectRef="__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_OfferOutputXItem"
+          name="Offer"
+        />
+        <bpmn2:inputSet>
+          
<bpmn2:dataInputRefs>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_CandidateDataInputX</bpmn2:dataInputRefs>
+        </bpmn2:inputSet>
+        <bpmn2:outputSet>
+          
<bpmn2:dataOutputRefs>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_OfferOutputX</bpmn2:dataOutputRefs>
+        </bpmn2:outputSet>
+      </bpmn2:ioSpecification>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from 
xsi:type="bpmn2:tFormalExpression"><![CDATA[NewHiringOffer.dmn]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_fileNameInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[https://kiegroup.org/dmn/_0DCC505E-71B4-4C29-8848-4006623FE51A]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_namespaceInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from xsi:type="bpmn2:tFormalExpression"><![CDATA[New Hiring 
Offer]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_modelInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>candidateData</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_CandidateDataInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataOutputAssociation>
+        
<bpmn2:sourceRef>_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_OfferOutputX</bpmn2:sourceRef>
+        <bpmn2:targetRef>offer</bpmn2:targetRef>
+      </bpmn2:dataOutputAssociation>
+      <bpmn2:potentialOwner id="PotentialOwner_1" name="Potential Owner 1">
+        <bpmn2:resourceAssignmentExpression 
id="ResourceAssignmentExpression_1">
+          <bpmn2:formalExpression 
id="FormalExpression_19">mary</bpmn2:formalExpression>
+        </bpmn2:resourceAssignmentExpression>
+      </bpmn2:potentialOwner>
+    </bpmn2:userTask>
+    <bpmn2:endEvent id="_457DC13A-0AEC-4390-A860-5CCFFB67B366">
+      <bpmn2:incoming>_527D3164-4989-4D2C-B80B-9BA9D4C8FB89</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:scriptTask
+      id="_4B7FF147-F096-435B-8CAF-48318EF786B0"
+      name="Application denied"
+      scriptFormat="http://www.java.com/java";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Application denied]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_94172225-E124-4F14-98DA-C3D62C11254A</bpmn2:incoming>
+      <bpmn2:outgoing>_527D3164-4989-4D2C-B80B-9BA9D4C8FB89</bpmn2:outgoing>
+      <bpmn2:script
+      >System.out.println("[" + Thread.currentThread().getName() + "] END, 
procid=" + kcontext.getProcessInstance().getId());
+</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:exclusiveGateway
+      id="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+      drools:dg="_94172225-E124-4F14-98DA-C3D62C11254A"
+      gatewayDirection="Converging"
+      default="_94172225-E124-4F14-98DA-C3D62C11254A"
+    >
+      <bpmn2:incoming>_5334FFDC-1FCB-47E6-8085-36DC9A3D17B9</bpmn2:incoming>
+      <bpmn2:incoming>_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E</bpmn2:incoming>
+      <bpmn2:incoming>_C6E61C53-FD35-4347-B69E-30AA93AE4404</bpmn2:incoming>
+      <bpmn2:outgoing>_94172225-E124-4F14-98DA-C3D62C11254A</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:exclusiveGateway
+      id="_A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+      drools:dg="_59F9A0E6-7F9C-43A9-8920-5B40A91169E6"
+      gatewayDirection="Diverging"
+      default="_59F9A0E6-7F9C-43A9-8920-5B40A91169E6"
+    >
+      <bpmn2:incoming>_5162ABF0-DD2E-4BDC-9A46-DDCFCB010287</bpmn2:incoming>
+      <bpmn2:outgoing>_59F9A0E6-7F9C-43A9-8920-5B40A91169E6</bpmn2:outgoing>
+      <bpmn2:outgoing>_C6E61C53-FD35-4347-B69E-30AA93AE4404</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:exclusiveGateway
+      id="_B9662806-84F3-4444-AD62-4790CDA7C85D"
+      drools:dg="_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E"
+      gatewayDirection="Diverging"
+      default="_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E"
+    >
+      <bpmn2:incoming>_C62F7EFB-A009-450A-81C7-57D36F0DF766</bpmn2:incoming>
+      <bpmn2:outgoing>_B11455DE-F77A-4251-A85B-4C66636E3CD9</bpmn2:outgoing>
+      <bpmn2:outgoing>_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:scriptTask
+      id="_834B21EF-9229-44F8-A5DB-D96EBB39A347"
+      name="Send notification HR Interview avoided"
+      scriptFormat="http://www.java.com/java";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Send notification HR Interview 
avoided]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_7B41F971-C74D-4036-8A5E-EFF81C37986A</bpmn2:incoming>
+      <bpmn2:outgoing>_5334FFDC-1FCB-47E6-8085-36DC9A3D17B9</bpmn2:outgoing>
+      <bpmn2:script>System.out.println("###################################");
+System.out.println("HR Interview have been avoided after reasonable time");
+System.out.println("###################################");
+</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:scriptTask
+      id="_5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+      name="New Hiring"
+      scriptFormat="http://www.java.com/java";
+    >
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[New Hiring]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_AE65A7EC-5499-43FF-9429-EA56E9AD7DFD</bpmn2:incoming>
+      <bpmn2:outgoing>_5162ABF0-DD2E-4BDC-9A46-DDCFCB010287</bpmn2:outgoing>
+      <bpmn2:script
+      >System.out.println("New Hiring has been created for candidate: " + 
candidateData.getFullName() + ", procid=" + 
kcontext.getProcessInstance().getId());
+
+kcontext.setVariable("hr_approval", false);
+kcontext.setVariable("it_approval", false);</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:userTask id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E" name="IT 
Interview">
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[IT Interview]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_A76C6603-0406-423C-940B-3403948DCA1F</bpmn2:incoming>
+      <bpmn2:outgoing>_C62F7EFB-A009-450A-81C7-57D36F0DF766</bpmn2:outgoing>
+      <bpmn2:ioSpecification>
+        <bpmn2:dataInput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputX"
+          drools:dtype="Object"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputXItem"
+          name="TaskName"
+        />
+        <bpmn2:dataInput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_candidateInputX"
+          drools:dtype="org.kie.kogito.codegen.tests.CandidateData"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_candidateInputXItem"
+          name="candidate"
+        />
+        <bpmn2:dataInput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_offerInputX"
+          drools:dtype="org.kie.kogito.codegen.tests.Offer"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_offerInputXItem"
+          name="offer"
+        />
+        <bpmn2:dataInput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveInputX"
+          drools:dtype="Boolean"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveInputXItem"
+          name="approve"
+        />
+        <bpmn2:dataInput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputX"
+          drools:dtype="Object"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputXItem"
+          name="Skippable"
+        />
+        <bpmn2:dataOutput
+          id="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveOutputX"
+          drools:dtype="Boolean"
+          
itemSubjectRef="__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveOutputXItem"
+          name="approve"
+        />
+        <bpmn2:inputSet>
+          
<bpmn2:dataInputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_candidateInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_offerInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputX</bpmn2:dataInputRefs>
+        </bpmn2:inputSet>
+        <bpmn2:outputSet>
+          
<bpmn2:dataOutputRefs>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveOutputX</bpmn2:dataOutputRefs>
+        </bpmn2:outputSet>
+      </bpmn2:ioSpecification>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from 
xsi:type="bpmn2:tFormalExpression"><![CDATA[ITInterview]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_TaskNameInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>candidateData</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_candidateInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>offer</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_offerInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>it_approval</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from 
xsi:type="bpmn2:tFormalExpression"><![CDATA[false]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_SkippableInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataOutputAssociation>
+        
<bpmn2:sourceRef>_8962C15F-55EC-46F7-B926-5D5A1FD8D35E_approveOutputX</bpmn2:sourceRef>
+        <bpmn2:targetRef>it_approval</bpmn2:targetRef>
+      </bpmn2:dataOutputAssociation>
+      <bpmn2:potentialOwner id="_nYwPQOiwED2JqoGgi3DJyQ">
+        <bpmn2:resourceAssignmentExpression id="_nYwPQeiwED2JqoGgi3DJyQ">
+          <bpmn2:formalExpression>jdoe</bpmn2:formalExpression>
+        </bpmn2:resourceAssignmentExpression>
+      </bpmn2:potentialOwner>
+    </bpmn2:userTask>
+    <bpmn2:userTask id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6" name="HR 
Interview">
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[HR Interview]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_ACEE7578-B7D2-4EDF-B104-9ECF3DD8A383</bpmn2:incoming>
+      <bpmn2:outgoing>_A76C6603-0406-423C-940B-3403948DCA1F</bpmn2:outgoing>
+      <bpmn2:ioSpecification>
+        <bpmn2:dataInput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputX"
+          drools:dtype="Object"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputXItem"
+          name="TaskName"
+        />
+        <bpmn2:dataInput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_candidateInputX"
+          drools:dtype="org.kie.kogito.codegen.tests.CandidateData"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_candidateInputXItem"
+          name="candidate"
+        />
+        <bpmn2:dataInput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerInputX"
+          drools:dtype="org.kie.kogito.codegen.tests.Offer"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerInputXItem"
+          name="offer"
+        />
+        <bpmn2:dataInput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveInputX"
+          drools:dtype="Boolean"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveInputXItem"
+          name="approve"
+        />
+        <bpmn2:dataInput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputX"
+          drools:dtype="Object"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputXItem"
+          name="Skippable"
+        />
+        <bpmn2:dataOutput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveOutputX"
+          drools:dtype="Boolean"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveOutputXItem"
+          name="approve"
+        />
+        <bpmn2:dataOutput
+          id="_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerOutputX"
+          drools:dtype="org.kie.kogito.codegen.tests.Offer"
+          
itemSubjectRef="__B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerOutputXItem"
+          name="offer"
+        />
+        <bpmn2:inputSet>
+          
<bpmn2:dataInputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_candidateInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveInputX</bpmn2:dataInputRefs>
+          
<bpmn2:dataInputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputX</bpmn2:dataInputRefs>
+        </bpmn2:inputSet>
+        <bpmn2:outputSet>
+          
<bpmn2:dataOutputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveOutputX</bpmn2:dataOutputRefs>
+          
<bpmn2:dataOutputRefs>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerOutputX</bpmn2:dataOutputRefs>
+        </bpmn2:outputSet>
+      </bpmn2:ioSpecification>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from 
xsi:type="bpmn2:tFormalExpression"><![CDATA[HRInterview]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_B8C4F63C-81AD-4291-9C1B-84967277EEF6_TaskNameInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>candidateData</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_candidateInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>offer</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>hr_approval</bpmn2:sourceRef>
+        
<bpmn2:targetRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        
<bpmn2:targetRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputX</bpmn2:targetRef>
+        <bpmn2:assignment>
+          <bpmn2:from 
xsi:type="bpmn2:tFormalExpression"><![CDATA[false]]></bpmn2:from>
+          <bpmn2:to
+            xsi:type="bpmn2:tFormalExpression"
+          
><![CDATA[_B8C4F63C-81AD-4291-9C1B-84967277EEF6_SkippableInputX]]></bpmn2:to>
+        </bpmn2:assignment>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataOutputAssociation>
+        
<bpmn2:sourceRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_approveOutputX</bpmn2:sourceRef>
+        <bpmn2:targetRef>hr_approval</bpmn2:targetRef>
+      </bpmn2:dataOutputAssociation>
+      <bpmn2:dataOutputAssociation>
+        
<bpmn2:sourceRef>_B8C4F63C-81AD-4291-9C1B-84967277EEF6_offerOutputX</bpmn2:sourceRef>
+        <bpmn2:targetRef>offer</bpmn2:targetRef>
+      </bpmn2:dataOutputAssociation>
+      <bpmn2:potentialOwner id="_nYw2UOiwED2JqoGgi3DJyQ">
+        <bpmn2:resourceAssignmentExpression id="_nYw2UeiwED2JqoGgi3DJyQ">
+          <bpmn2:formalExpression>jdoe</bpmn2:formalExpression>
+        </bpmn2:resourceAssignmentExpression>
+      </bpmn2:potentialOwner>
+    </bpmn2:userTask>
+    <bpmn2:startEvent id="_1639F738-45F3-4CD6-A80E-CCEBAA605D56">
+      <bpmn2:outgoing>_4085EC5F-5D62-430A-AF40-1FD1DDAC6797</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:boundaryEvent
+      id="_116F3C54-A10E-4952-9E08-1CACE74CED0B"
+      drools:dockerinfo="59.2^74|"
+      drools:boundaryca="true"
+      attachedToRef="_B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+    >
+      <bpmn2:outgoing>_7B41F971-C74D-4036-8A5E-EFF81C37986A</bpmn2:outgoing>
+      <bpmn2:timerEventDefinition>
+        <bpmn2:timeDuration 
xsi:type="bpmn2:tFormalExpression">PT180S</bpmn2:timeDuration>
+      </bpmn2:timerEventDefinition>
+    </bpmn2:boundaryEvent>
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram>
+    <bpmndi:BPMNPlane bpmnElement="hiring">
+      <bpmndi:BPMNShape
+        id="shape__116F3C54-A10E-4952-9E08-1CACE74CED0B"
+        bpmnElement="_116F3C54-A10E-4952-9E08-1CACE74CED0B"
+      >
+        <dc:Bounds height="56" width="56" x="1283.2" y="76.00000000000006" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__1639F738-45F3-4CD6-A80E-CCEBAA605D56"
+        bpmnElement="_1639F738-45F3-4CD6-A80E-CCEBAA605D56"
+      >
+        <dc:Bounds height="55.99999999999994" width="56" x="70" 
y="25.000000000000057" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+        bpmnElement="_B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+      >
+        <dc:Bounds height="102" width="154" x="1224" y="2.0000000000000497" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__8962C15F-55EC-46F7-B926-5D5A1FD8D35E"
+        bpmnElement="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E"
+      >
+        <dc:Bounds height="102" width="154" x="1407.75" y="2.0000000000000497" 
/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+        bpmnElement="_5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+      >
+        <dc:Bounds height="102" width="154" x="585.7499999999999" 
y="2.0000000000000497" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__834B21EF-9229-44F8-A5DB-D96EBB39A347"
+        bpmnElement="_834B21EF-9229-44F8-A5DB-D96EBB39A347"
+      >
+        <dc:Bounds height="102" width="154" x="1237" y="187.00000000000006" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__B9662806-84F3-4444-AD62-4790CDA7C85D"
+        bpmnElement="_B9662806-84F3-4444-AD62-4790CDA7C85D"
+      >
+        <dc:Bounds height="56.00000000000001" width="56" x="1587.75" 
y="25.00000000000005" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+        bpmnElement="_A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+      >
+        <dc:Bounds height="56.00000000000001" width="56" x="766.7499999999999" 
y="25.00000000000005" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+        bpmnElement="_30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+      >
+        <dc:Bounds height="56" width="56" x="1587.75" y="382" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__4B7FF147-F096-435B-8CAF-48318EF786B0"
+        bpmnElement="_4B7FF147-F096-435B-8CAF-48318EF786B0"
+      >
+        <dc:Bounds height="102" width="154" x="1686.75" y="359.00000000000006" 
/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__457DC13A-0AEC-4390-A860-5CCFFB67B366"
+        bpmnElement="_457DC13A-0AEC-4390-A860-5CCFFB67B366"
+      >
+        <dc:Bounds height="56" width="56" x="1891.75" y="382" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+        bpmnElement="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+      >
+        <dc:Bounds height="102" width="154" x="858.7499999999999" 
y="2.0000000000000497" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__6CE52250-BCEE-485C-8AE4-F6CACF2EF5A1"
+        bpmnElement="_6CE52250-BCEE-485C-8AE4-F6CACF2EF5A1"
+      >
+        <dc:Bounds height="56.00000000000001" width="56" x="1891.75" 
y="25.00000000000005" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+        bpmnElement="_57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+      >
+        <dc:Bounds height="102" width="154" x="1041.75" y="2.0000000000000497" 
/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+        bpmnElement="_940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+      >
+        <dc:Bounds height="102" width="154" x="1686.75" y="2.0000000000000497" 
/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+        bpmnElement="_2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+      >
+        <dc:Bounds height="56" width="56" x="161" y="25" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__5D4415F3-B226-4641-8397-DA9714446AEE"
+        bpmnElement="_5D4415F3-B226-4641-8397-DA9714446AEE"
+      >
+        <dc:Bounds height="102" width="154" x="278.66666666666663" 
y="1.6666666666666998" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__8D7D5941-E108-4158-8514-312860B509DB"
+        bpmnElement="_8D7D5941-E108-4158-8514-312860B509DB"
+      >
+        <dc:Bounds height="102" width="154" x="279" y="206" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape
+        id="shape__2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+        bpmnElement="_2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+      >
+        <dc:Bounds height="56" width="56" x="495" y="24.50000000000019" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__116F3C54-A10E-4952-9E08-1CACE74CED0B_to_shape__834B21EF-9229-44F8-A5DB-D96EBB39A347"
+        bpmnElement="_7B41F971-C74D-4036-8A5E-EFF81C37986A"
+      >
+        <di:waypoint x="1311.2" y="104.00000000000006" />
+        <di:waypoint x="1314" y="238.00000000000006" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__1639F738-45F3-4CD6-A80E-CCEBAA605D56_to_shape__2C5073FB-03B9-40A0-AEDF-D72E12FADCB3"
+        bpmnElement="_4085EC5F-5D62-430A-AF40-1FD1DDAC6797"
+      >
+        <di:waypoint x="98" y="53.00000000000003" />
+        <di:waypoint x="189" y="25" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C_to_shape__B8C4F63C-81AD-4291-9C1B-84967277EEF6"
+        bpmnElement="_ACEE7578-B7D2-4EDF-B104-9ECF3DD8A383"
+      >
+        <di:waypoint x="1118.75" y="53.00000000000005" />
+        <di:waypoint x="1224" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__B8C4F63C-81AD-4291-9C1B-84967277EEF6_to_shape__8962C15F-55EC-46F7-B926-5D5A1FD8D35E"
+        bpmnElement="_A76C6603-0406-423C-940B-3403948DCA1F"
+      >
+        <di:waypoint x="1301" y="53.00000000000005" />
+        <di:waypoint x="1407.75" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__8962C15F-55EC-46F7-B926-5D5A1FD8D35E_to_shape__B9662806-84F3-4444-AD62-4790CDA7C85D"
+        bpmnElement="_C62F7EFB-A009-450A-81C7-57D36F0DF766"
+      >
+        <di:waypoint x="1561.75" y="53.00000000000005" />
+        <di:waypoint x="1587.75" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__2C62E6FB-64E7-485E-8F02-6368EC7C42A3_to_shape__5BDBE48C-CC83-46A9-9D56-F846F8FC1045"
+        bpmnElement="_AE65A7EC-5499-43FF-9429-EA56E9AD7DFD"
+      >
+        <di:waypoint x="523" y="52.500000000000185" />
+        <di:waypoint x="662.7499999999999" y="104.00000000000006" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__5BDBE48C-CC83-46A9-9D56-F846F8FC1045_to_shape__A51A809E-03C0-4EA7-91F1-7B3C5E29AD04"
+        bpmnElement="_5162ABF0-DD2E-4BDC-9A46-DDCFCB010287"
+      >
+        <di:waypoint x="739.7499999999999" y="53.00000000000005" />
+        <di:waypoint x="766.7499999999999" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__834B21EF-9229-44F8-A5DB-D96EBB39A347_to_shape__30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+        bpmnElement="_5334FFDC-1FCB-47E6-8085-36DC9A3D17B9"
+      >
+        <di:waypoint x="1314" y="238.00000000000006" />
+        <di:waypoint x="1587.75" y="410" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__B9662806-84F3-4444-AD62-4790CDA7C85D_to_shape__940F2A0C-8CC6-4ECA-B504-49363AF68B67"
+        bpmnElement="_B11455DE-F77A-4251-A85B-4C66636E3CD9"
+      >
+        <di:waypoint x="1643.75" y="53.00000000000005" />
+        <di:waypoint x="1686.75" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__B9662806-84F3-4444-AD62-4790CDA7C85D_to_shape__30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+        bpmnElement="_B7FC63DD-C08F-4CB3-A51A-79C1B8B18E6E"
+      >
+        <di:waypoint x="1615.75" y="81.00000000000006" />
+        <di:waypoint x="1615.75" y="410" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__A51A809E-03C0-4EA7-91F1-7B3C5E29AD04_to_shape__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A"
+        bpmnElement="_59F9A0E6-7F9C-43A9-8920-5B40A91169E6"
+      >
+        <di:waypoint x="794.7499999999999" y="53.00000000000005" />
+        <di:waypoint x="858.7499999999999" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__A51A809E-03C0-4EA7-91F1-7B3C5E29AD04_to_shape__30C8C01B-4149-4AE5-8D86-D27D57BCA8E7"
+        bpmnElement="_C6E61C53-FD35-4347-B69E-30AA93AE4404"
+      >
+        <di:waypoint x="794.7499999999999" y="81.00000000000006" />
+        <di:waypoint x="794.7499999999999" y="410.00000811728415" />
+        <di:waypoint x="1615.75" y="410" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__30C8C01B-4149-4AE5-8D86-D27D57BCA8E7_to_shape__4B7FF147-F096-435B-8CAF-48318EF786B0"
+        bpmnElement="_94172225-E124-4F14-98DA-C3D62C11254A"
+      >
+        <di:waypoint x="1615.75" y="410" />
+        <di:waypoint x="1686.75" y="410.00000000000006" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__4B7FF147-F096-435B-8CAF-48318EF786B0_to_shape__457DC13A-0AEC-4390-A860-5CCFFB67B366"
+        bpmnElement="_527D3164-4989-4D2C-B80B-9BA9D4C8FB89"
+      >
+        <di:waypoint x="1763.75" y="410.00000000000006" />
+        <di:waypoint x="1968.75" y="382" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A_to_shape__57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C"
+        bpmnElement="_9C33F5EA-89C7-4ED1-B3C2-CF18DE439AF5"
+      >
+        <di:waypoint x="935.7499999999999" y="53.00000000000005" />
+        <di:waypoint x="1118.75" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__940F2A0C-8CC6-4ECA-B504-49363AF68B67_to_shape__6CE52250-BCEE-485C-8AE4-F6CACF2EF5A1"
+        bpmnElement="_7DDA574A-C220-4FEF-9784-22EF8052EDEC"
+      >
+        <di:waypoint x="1763.75" y="53.00000000000005" />
+        <di:waypoint x="1919.75" y="53.00000000000005" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__2C5073FB-03B9-40A0-AEDF-D72E12FADCB3_to_shape__5D4415F3-B226-4641-8397-DA9714446AEE"
+        bpmnElement="_800CBA8E-67E6-42A5-A075-C6B564E1AE7D"
+      >
+        <di:waypoint x="189" y="53" />
+        <di:waypoint x="306.66666666666663" y="1.6666666666666998" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__2C5073FB-03B9-40A0-AEDF-D72E12FADCB3_to_shape__8D7D5941-E108-4158-8514-312860B509DB"
+        bpmnElement="_25AD4191-61BF-48D4-92D7-B8543813E021"
+      >
+        <di:waypoint x="189" y="81" />
+        <di:waypoint x="189" y="257" />
+        <di:waypoint x="279" y="257" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__5D4415F3-B226-4641-8397-DA9714446AEE_to_shape__2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+        bpmnElement="_2530A25C-48A5-494C-86A1-ED39F94265A0"
+      >
+        <di:waypoint x="355.66666666666663" y="52.6666666666667" />
+        <di:waypoint x="523" y="52.500000000000185" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge
+        
id="edge_shape__8D7D5941-E108-4158-8514-312860B509DB_to_shape__2C62E6FB-64E7-485E-8F02-6368EC7C42A3"
+        bpmnElement="_AFE232D5-9172-4279-8398-44BF84489B46"
+      >
+        <di:waypoint x="433" y="257" />
+        <di:waypoint x="523" y="257" />
+        <di:waypoint x="523" y="80.50000000000018" />
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+  <bpmn2:relationship type="BPSimData">
+    <bpmn2:extensionElements>
+      <bpsim:BPSimData>
+        <bpsim:Scenario id="default" name="Simulationscenario">
+          <bpsim:ScenarioParameters />
+          <bpsim:ElementParameters 
elementRef="_1639F738-45F3-4CD6-A80E-CCEBAA605D56">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_B8C4F63C-81AD-4291-9C1B-84967277EEF6">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_8962C15F-55EC-46F7-B926-5D5A1FD8D35E">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_5BDBE48C-CC83-46A9-9D56-F846F8FC1045">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_834B21EF-9229-44F8-A5DB-D96EBB39A347">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_4B7FF147-F096-435B-8CAF-48318EF786B0">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_F4D56F6C-4CFE-4D5C-BF5E-67261F68EF1A">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_57DBE42C-6850-4A08-AC73-2BB0FFDFCC8C">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_940F2A0C-8CC6-4ECA-B504-49363AF68B67">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_5D4415F3-B226-4641-8397-DA9714446AEE">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+          <bpsim:ElementParameters 
elementRef="_8D7D5941-E108-4158-8514-312860B509DB">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0" />
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0" />
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
+        </bpsim:Scenario>
+      </bpsim:BPSimData>
+    </bpmn2:extensionElements>
+    <bpmn2:source>_nYr90OiwED2JqoGgi3DJyQ</bpmn2:source>
+    <bpmn2:target>_nYr90OiwED2JqoGgi3DJyQ</bpmn2:target>
+  </bpmn2:relationship>
+</bpmn2:definitions>
\ No newline at end of file
diff --git 
a/quarkus/addons/persistence/kafka/runtime/src/main/java/org/kie/kogito/persistence/kafka/KafkaProcessInstances.java
 
b/quarkus/addons/persistence/kafka/runtime/src/main/java/org/kie/kogito/persistence/kafka/KafkaProcessInstances.java
index c3f2d20ed1..07bda60bdf 100644
--- 
a/quarkus/addons/persistence/kafka/runtime/src/main/java/org/kie/kogito/persistence/kafka/KafkaProcessInstances.java
+++ 
b/quarkus/addons/persistence/kafka/runtime/src/main/java/org/kie/kogito/persistence/kafka/KafkaProcessInstances.java
@@ -151,7 +151,13 @@ public class KafkaProcessInstances implements 
MutableProcessInstances {
 
     @Override
     public Optional<ProcessInstance<?>> findById(String id, 
ProcessInstanceReadMode mode) {
-        return 
getProcessInstanceById(id).map(marshaller.createUnmarshallFunction(process, 
mode));
+        return getProcessInstanceById(id).map(r -> {
+            AbstractProcessInstance pi = (AbstractProcessInstance) 
marshaller.createUnmarshallFunction(process, mode).apply(r);
+            if (!ProcessInstanceReadMode.READ_ONLY.equals(mode)) {
+                disconnect(pi);
+            }
+            return pi;
+        });
     }
 
     @Override
@@ -163,6 +169,7 @@ public class KafkaProcessInstances implements 
MutableProcessInstances {
     }
 
     protected void disconnect(ProcessInstance<?> instance) {
-        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance(marshaller.createdReloadFunction(() -> 
getProcessInstanceById(instance.id()).orElseThrow()));
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> 
getProcessInstanceById(instance.id()).orElseThrow()));
+        ((AbstractProcessInstance<?>) 
instance).internalRemoveProcessInstance();
     }
 }
diff --git 
a/quarkus/addons/persistence/kafka/runtime/src/test/java/org/kie/kogito/persistence/kafka/KafkaProcessInstancesTest.java
 
b/quarkus/addons/persistence/kafka/runtime/src/test/java/org/kie/kogito/persistence/kafka/KafkaProcessInstancesTest.java
index 2b62a51685..a6eea99ddd 100644
--- 
a/quarkus/addons/persistence/kafka/runtime/src/test/java/org/kie/kogito/persistence/kafka/KafkaProcessInstancesTest.java
+++ 
b/quarkus/addons/persistence/kafka/runtime/src/test/java/org/kie/kogito/persistence/kafka/KafkaProcessInstancesTest.java
@@ -127,7 +127,7 @@ public class KafkaProcessInstancesTest {
 
     @Test
     public void testProcessInstancesFindById() {
-        
doReturn(mock(ProcessInstance.class)).when(marshaller).unmarshallProcessInstance(any(),
 any(), eq(ProcessInstanceReadMode.MUTABLE));
+        
doReturn(mock(AbstractProcessInstance.class)).when(marshaller).unmarshallProcessInstance(any(),
 any(), eq(ProcessInstanceReadMode.MUTABLE));
 
         doReturn(new byte[] {}).when(store).get(storedId);
 
@@ -137,7 +137,7 @@ public class KafkaProcessInstancesTest {
 
     @Test
     public void testProcessInstancesFindByIdReadOnly() {
-        
doReturn(mock(ProcessInstance.class)).when(marshaller).unmarshallProcessInstance(any(),
 any(), eq(ProcessInstanceReadMode.READ_ONLY));
+        
doReturn(mock(AbstractProcessInstance.class)).when(marshaller).unmarshallProcessInstance(any(),
 any(), eq(ProcessInstanceReadMode.READ_ONLY));
 
         doReturn(new byte[] {}).when(store).get(storedId);
 
@@ -206,7 +206,7 @@ public class KafkaProcessInstancesTest {
         assertThat(captor.getValue().key()).isEqualTo(storedId);
         assertThat(captor.getValue().topic()).isEqualTo(topicName());
 
-        verify(instance).internalRemoveProcessInstance(any());
+        verify(instance).internalRemoveProcessInstance();
         verify(marshaller).createdReloadFunction(any());
     }
 
diff --git 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
 
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
index 85f4d6c6ec..13626f6f11 100644
--- 
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
+++ 
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-kafka-persistence/src/test/java/org/kie/kogito/it/KafkaPersistenceIT.java
@@ -18,6 +18,7 @@
  */
 package org.kie.kogito.it;
 
+import org.junit.jupiter.api.Disabled;
 import org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource;
 
 import io.quarkus.test.common.QuarkusTestResource;
@@ -28,6 +29,7 @@ import static 
org.kie.kogito.testcontainers.quarkus.KafkaQuarkusTestResource.KOG
 
 @QuarkusIntegrationTest
 @QuarkusTestResource(value = KafkaQuarkusTestResource.class, initArgs = { 
@ResourceArg(name = KOGITO_KAFKA_TOPICS, value = KafkaPersistenceIT.TOPICS) })
+@Disabled
 public class KafkaPersistenceIT extends PersistenceTest {
 
     public static final String TOPICS = "kogito.process";


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to