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 348ee1d325 [NO_ISSUE] remove duplicate start events (#4040)
348ee1d325 is described below

commit 348ee1d325fac00a7de18424becb9bcaaf8655c0
Author: Enrique <[email protected]>
AuthorDate: Thu Aug 28 17:04:40 2025 +0200

    [NO_ISSUE] remove duplicate start events (#4040)
    
    * [NO_ISSUE] remove duplicate start events
    
    * fix duplicate event listeners during activation
    
    * fix start event
    
    * fix imports
    
    * fix tests
---
 .../impl/InMemoryProcessJobExecutorFactory.java    | 12 ++++++-----
 .../jbpm/process/instance/LightProcessRuntime.java | 14 +++++--------
 .../instance/LightProcessRuntimeContext.java       |  5 -----
 .../process/instance/ProcessRuntimeContext.java    |  2 --
 .../kie/kogito/process/impl/AbstractProcess.java   | 24 +++++-----------------
 .../test/java/org/jbpm/bpmn2/StartEventTest.java   |  4 ++--
 .../org/kie/kogito/codegen/tests/TimerEventIT.java |  2 --
 7 files changed, 19 insertions(+), 44 deletions(-)

diff --git 
a/api/kogito-services/src/main/java/org/kie/kogito/services/jobs/impl/InMemoryProcessJobExecutorFactory.java
 
b/api/kogito-services/src/main/java/org/kie/kogito/services/jobs/impl/InMemoryProcessJobExecutorFactory.java
index 00ed9f8f49..38eff10594 100644
--- 
a/api/kogito-services/src/main/java/org/kie/kogito/services/jobs/impl/InMemoryProcessJobExecutorFactory.java
+++ 
b/api/kogito-services/src/main/java/org/kie/kogito/services/jobs/impl/InMemoryProcessJobExecutorFactory.java
@@ -77,11 +77,12 @@ public class InMemoryProcessJobExecutorFactory implements 
JobExecutorFactory {
     }
 
     protected Runnable processJobByDescription(JobsService jobService, 
InMemoryJobContext jobsConfiguration, ProcessJobDescription description) {
-        return new StartProcessOnExpiredTimer(jobService, jobsConfiguration, 
description.id(), description.process(), true, -1);
+        return new StartProcessOnExpiredTimer(jobService, jobsConfiguration, 
description.id(), description.processId(), true, -1);
     }
 
     protected Runnable repeatableJobByDescription(JobsService jobService, 
InMemoryJobContext jobsConfiguration, ProcessJobDescription description) {
-        return new StartProcessOnExpiredTimer(jobService, jobsConfiguration, 
description.id(), description.process(), false, 
description.expirationTime().repeatLimit());
+        return new StartProcessOnExpiredTimer(jobService, jobsConfiguration, 
description.id(), description.processId(), false,
+                description.expirationTime().repeatLimit());
     }
 
 }
@@ -147,16 +148,16 @@ class StartProcessOnExpiredTimer implements Runnable {
 
     private boolean removeAtExecution;
     @SuppressWarnings("rawtypes")
-    private org.kie.kogito.process.Process process;
+    private String processId;
 
     private Integer limit;
 
     private JobsService jobService;
     private InMemoryJobContext jobsConfiguration;
 
-    public StartProcessOnExpiredTimer(JobsService jobService, 
InMemoryJobContext jobsConfiguration, String id, 
org.kie.kogito.process.Process<?> process, boolean removeAtExecution, Integer 
limit) {
+    public StartProcessOnExpiredTimer(JobsService jobService, 
InMemoryJobContext jobsConfiguration, String id, String processId, boolean 
removeAtExecution, Integer limit) {
         this.id = id;
-        this.process = process;
+        this.processId = processId;
         this.removeAtExecution = removeAtExecution;
         this.limit = limit;
         this.jobsConfiguration = jobsConfiguration;
@@ -169,6 +170,7 @@ class StartProcessOnExpiredTimer implements Runnable {
         try {
             LOGGER.debug("Job {} started", id);
             
UnitOfWorkExecutor.executeInUnitOfWork(jobsConfiguration.unitOfWorkManager(), 
() -> {
+                org.kie.kogito.process.Process process = 
jobsConfiguration.processes().processById(processId);
                 org.kie.kogito.process.ProcessInstance<?> pi = 
process.createInstance(process.createModel());
                 if (pi != null) {
                     pi.start(TRIGGER, null);
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java
index 7c1a43e5c8..0148e40713 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java
@@ -82,10 +82,9 @@ public class LightProcessRuntime extends 
AbstractProcessRuntime {
         this.jobService = services.getJobsService();
         this.processEventSupport = services.getEventSupport();
         this.workItemManager = services.getKogitoWorkItemManager();
-        if (isActive()) {
-            initProcessEventListeners();
-            initStartTimers();
-        }
+
+        initProcessEventListeners();
+        initStartTimers();
         initProcessActivationListener();
     }
 
@@ -378,6 +377,8 @@ public class LightProcessRuntime extends 
AbstractProcessRuntime {
 
     @Override
     public void dispose() {
+        removeProcessEventListeners();
+        initStartTimers();
         this.processEventSupport.reset();
         runtimeContext = null;
     }
@@ -392,11 +393,6 @@ public class LightProcessRuntime extends 
AbstractProcessRuntime {
         this.processInstanceManager.clearProcessInstancesState();
     }
 
-    public boolean isActive() {
-        // originally: kruntime.getEnvironment().get("Active")
-        return runtimeContext.isActive();
-    }
-
     public class SignalManagerSignalAction extends 
PropagationEntry.AbstractPropagationEntry implements WorkingMemoryAction {
 
         private String type;
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntimeContext.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntimeContext.java
index 3fe0f58ebc..2d7bc5c1f5 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntimeContext.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntimeContext.java
@@ -69,11 +69,6 @@ public class LightProcessRuntimeContext implements 
ProcessRuntimeContext {
 
     }
 
-    @Override
-    public boolean isActive() {
-        return true;
-    }
-
     @Override
     public ProcessInstance createProcessInstance(Process process, 
CorrelationKey correlationKey) {
 
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeContext.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeContext.java
index e3d875b2a3..f5fc78d3f7 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeContext.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeContext.java
@@ -41,8 +41,6 @@ public interface ProcessRuntimeContext {
 
     void addEventListener(DefaultAgendaEventListener conditional);
 
-    boolean isActive();
-
     ProcessInstance createProcessInstance(Process process, CorrelationKey 
correlationKey);
 
     void setupParameters(ProcessInstance pi, Map<String, Object> parameters);
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcess.java 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcess.java
index 0a17f49a3f..cce17f0560 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcess.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcess.java
@@ -18,7 +18,6 @@
  */
 package org.kie.kogito.process.impl;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -38,8 +37,6 @@ import org.jbpm.process.instance.LightProcessRuntime;
 import org.jbpm.process.instance.LightProcessRuntimeServiceProvider;
 import org.jbpm.process.instance.ProcessRuntimeServiceProvider;
 import org.jbpm.ruleflow.core.RuleFlowProcess;
-import org.jbpm.workflow.core.impl.WorkflowProcessImpl;
-import org.jbpm.workflow.core.node.StartNode;
 import org.kie.api.runtime.process.EventListener;
 import org.kie.api.runtime.process.WorkflowProcessInstance;
 import org.kie.kogito.Application;
@@ -57,7 +54,6 @@ import org.kie.kogito.internal.utils.ConversionUtils;
 import org.kie.kogito.jobs.DurationExpirationTime;
 import org.kie.kogito.jobs.ExactExpirationTime;
 import org.kie.kogito.jobs.ExpirationTime;
-import org.kie.kogito.jobs.descriptors.ProcessJobDescription;
 import org.kie.kogito.process.MutableProcessInstances;
 import org.kie.kogito.process.Process;
 import org.kie.kogito.process.ProcessConfig;
@@ -85,8 +81,8 @@ public abstract class AbstractProcess<T extends Model> 
implements Process<T>, Pr
     protected Application app;
 
     protected boolean activated;
-    protected List<String> startTimerInstances = new ArrayList<>();
     protected KogitoProcessRuntime processRuntime;
+    protected InternalProcessRuntime internalProcessRuntime;
 
     private org.kie.api.definition.process.Process process;
     private Lock processInitLock = new ReentrantLock();
@@ -226,18 +222,9 @@ public abstract class AbstractProcess<T extends Model> 
implements Process<T>, Pr
         if (this.activated) {
             return;
         }
+        this.internalProcessRuntime = LightProcessRuntime.of(app, 
Collections.singletonList(get()), services);
         this.processRuntime = createProcessRuntime().getKogitoProcessRuntime();
-        WorkflowProcessImpl p = (WorkflowProcessImpl) get();
         configure();
-        List<StartNode> startNodes = p.getTimerStart();
-        if (startNodes != null && !startNodes.isEmpty()) {
-            for (StartNode startNode : startNodes) {
-                if (startNode != null && startNode.getTimer() != null) {
-                    String timerId = 
processRuntime.getJobsService().scheduleJob(ProcessJobDescription.of(configureTimerInstance(startNode.getTimer()),
 this));
-                    startTimerInstances.add(timerId);
-                }
-            }
-        }
         // this belongs to only for the work item handler so we keep within 
the context of the current process instance loaded in memory
         if (this.services.getSignalManager() instanceof SignalManagerHub 
signalManagerHub) {
             processInstanceResolver = new ProcessInstanceResolver<T>() {
@@ -273,12 +260,11 @@ public abstract class AbstractProcess<T extends Model> 
implements Process<T>, Pr
 
     @Override
     public void deactivate() {
-        for (String startTimerId : startTimerInstances) {
-            this.processRuntime.getJobsService().cancelJob(startTimerId);
-        }
         if (this.services.getSignalManager() instanceof SignalManagerHub 
signalManagerHub) {
             
signalManagerHub.removeProcessInstanceResolver(processInstanceResolver);
         }
+        this.internalProcessRuntime.dispose();
+        this.internalProcessRuntime = null;
         this.activated = false;
     }
 
@@ -328,7 +314,7 @@ public abstract class AbstractProcess<T extends Model> 
implements Process<T>, Pr
     protected abstract org.kie.api.definition.process.Process process();
 
     protected InternalProcessRuntime createProcessRuntime() {
-        return LightProcessRuntime.of(app, Collections.singletonList(get()), 
services);
+        return internalProcessRuntime;
     }
 
     protected boolean isProcessFactorySet() {
diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java 
b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
index 8cd43e61b0..61df99b34c 100755
--- a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
+++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/StartEventTest.java
@@ -271,8 +271,8 @@ public class StartEventTest extends JbpmBpmn2TestCase {
         
assertThat(startedProcesses).extracting(ProcessInstance::getProcessId).containsExactly("SignalStart");
         definition.deactivate();
         definition.send(SignalFactory.of("MySignal", "NewValue"));
-        assertThat(startedProcesses).hasSize(2);
-        
assertThat(startedProcesses).extracting(ProcessInstance::getProcessId).containsExactly("SignalStart",
 "SignalStart");
+        assertThat(startedProcesses).hasSize(1);
+        
assertThat(startedProcesses).extracting(ProcessInstance::getProcessId).containsExactly("SignalStart");
     }
 
     @Test
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/TimerEventIT.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/TimerEventIT.java
index a347727b53..48fce488d8 100644
--- 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/TimerEventIT.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/TimerEventIT.java
@@ -298,7 +298,5 @@ public class TimerEventIT extends AbstractCodegenIT {
         // same amount of instances should be active as before deactivation
 
         assertSize(p.instances(), ProcessInstanceReadMode.MUTABLE, 2);
-        abort(p.instances());
-        await().until(() -> p.instances().stream().count() == 0);
     }
 }


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

Reply via email to