diff --git a/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java b/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java index 7fcc9d9604..590c57378a 100644 --- a/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java +++ b/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java @@ -99,12 +99,14 @@ public ProcessRuntimeImpl(InternalKnowledgeRuntime kruntime) { initSignalManager(); timerManager = new TimerManager(kruntime, kruntime.getTimerService()); processEventSupport = new ProcessEventSupport(); - initProcessEventListeners(); - initProcessActivationListener(); - initStartTimers(); + if (isActive()) { + initProcessEventListeners(); + initStartTimers(); + } + initProcessActivationListener(); } - private void initStartTimers() { + public void initStartTimers() { KieBase kbase = kruntime.getKieBase(); Collection processes = kbase.getProcesses(); for (Process process : processes) { @@ -127,9 +129,11 @@ public ProcessRuntimeImpl(InternalWorkingMemory workingMemory) { initSignalManager(); timerManager = new TimerManager(kruntime, kruntime.getTimerService()); processEventSupport = new ProcessEventSupport(); - initProcessEventListeners(); + if (isActive()) { + initProcessEventListeners(); + initStartTimers(); + } initProcessActivationListener(); - initStartTimers(); } private void initProcessInstanceManager() { @@ -289,12 +293,28 @@ public void removeProcessInstance(ProcessInstance processInstance) { processInstanceManager.removeProcessInstance( processInstance ); } - private void initProcessEventListeners() { + public void initProcessEventListeners() { for ( Process process : kruntime.getKieBase().getProcesses() ) { initProcessEventListener(process); } } + public void removeProcessEventListeners() { + for ( Process process : kruntime.getKieBase().getProcesses() ) { + removeProcessEventListener(process); + } + } + + private void removeProcessEventListener(Process process) { + if (process instanceof RuleFlowProcess) { + String type = (String) ((RuleFlowProcess) process).getRuntimeMetaData().get("StartProcessEventType"); + StartProcessEventListener listener = (StartProcessEventListener) ((RuleFlowProcess) process).getRuntimeMetaData().get("StartProcessEventListener"); + if (type != null && listener != null) { + signalManager.removeEventListener(type, listener); + } + } + } + private void initProcessEventListener(Process process) { if ( process instanceof RuleFlowProcess ) { for (Node node : ((RuleFlowProcess) process).getNodes()) { @@ -514,6 +534,15 @@ public void clearProcessInstancesState() { this.processInstanceManager.clearProcessInstancesState(); } + + public boolean isActive() { + Boolean active = (Boolean) kruntime.getEnvironment().get("Active"); + if (active == null) { + return true; + } + + return active.booleanValue(); + } public static class RegisterStartTimerAction extends PropagationEntry.AbstractPropagationEntry implements WorkingMemoryAction { diff --git a/jbpm-flow/src/main/java/org/jbpm/process/instance/timer/TimerManager.java b/jbpm-flow/src/main/java/org/jbpm/process/instance/timer/TimerManager.java index b951872260..d5ecbe369c 100644 --- a/jbpm-flow/src/main/java/org/jbpm/process/instance/timer/TimerManager.java +++ b/jbpm-flow/src/main/java/org/jbpm/process/instance/timer/TimerManager.java @@ -322,6 +322,16 @@ public void execute(JobContext c) { StartProcessJobContext ctx = (StartProcessJobContext) c; InternalKnowledgeRuntime kruntime = ctx.getKnowledgeRuntime(); + InternalProcessRuntime processRuntime = ((InternalProcessRuntime) ctx.getKnowledgeRuntime().getProcessRuntime()); + TimerManager tm = processRuntime.getTimerManager(); + + if (!((ProcessRuntimeImpl) processRuntime).isActive()) { + logger.debug("Timer for starting process {} is ignored as the deployment is in deactivated state", ctx.getProcessId()); + tm.getTimerMap().remove(ctx.getTimer().getId()); + tm.getTimerService().removeJob(ctx.getJobHandle()); + + return; + } try { ctx.getTimer().setLastTriggered( @@ -333,8 +343,6 @@ public void execute(JobContext c) { } ((ProcessRuntimeImpl)kruntime.getProcessRuntime()).startProcess(ctx.getProcessId(), ctx.getParamaeters(), "timer"); - TimerManager tm = ((InternalProcessRuntime) ctx.getKnowledgeRuntime().getProcessRuntime()).getTimerManager(); - if (ctx.getTimer().getPeriod() == 0) { tm.getTimerMap().remove(ctx.getTimer().getId()); tm.getTimerService().removeJob(ctx.getJobHandle()); diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/AbstractRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/AbstractRuntimeManager.java index 2efa066141..01caaf95d4 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/AbstractRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/AbstractRuntimeManager.java @@ -494,4 +494,24 @@ protected void releaseAndCleanLock(Long id, RuntimeEngine runtime) { } } + + protected boolean isActive() { + if (hasEnvironmentEntry("Active", false)) { + return false; + } + + return true; + } + + @Override + public void activate() { + ((SimpleRuntimeEnvironment) environment).addToEnvironment("Active", true); + + } + + @Override + public void deactivate() { + ((SimpleRuntimeEnvironment) environment).addToEnvironment("Active", false); + + } } diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java index 7d85c9d3e7..2425f438b6 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManager.java @@ -443,6 +443,19 @@ public Void execute(org.kie.internal.command.Context context) { throw new RuntimeException("Exception while initializing runtime manager " + this.identifier, e); } } + + @Override + public void activate() { + super.activate(); + // need to init one session to bootstrap all case - such as start timers + KieSession initialKsession = factory.newKieSession(); + initialKsession.execute(new DestroyKSessionCommand(initialKsession, this)); + } + + @Override + public void deactivate() { + super.deactivate(); + } public void destroyCase(CaseContext caseContext) { KieSession kieSession = null; @@ -614,6 +627,9 @@ private class PerCaseInitializer implements RuntimeEngineInitlializer { public KieSession initKieSession(Context context, InternalRuntimeManager manager, RuntimeEngine engine) { Object contextId = context.getContextId(); + if (contextId == null) { + contextId = manager.getIdentifier(); + } KieSession ksession = null; Long ksessionId = null; diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManager.java index 34f287cdc5..7e09702842 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManager.java @@ -419,6 +419,22 @@ public Void execute(org.kie.internal.command.Context context) { throw new RuntimeException("Exception while initializing runtime manager " + this.identifier, e); } } + + + @Override + public void activate() { + super.activate(); + + // need to init one session to bootstrap all case - such as start timers + KieSession initialKsession = factory.newKieSession(); + initialKsession.execute(new DestroyKSessionCommand(initialKsession, this)); + + } + + @Override + public void deactivate() { + super.deactivate(); + } private static class DestroyKSessionCommand implements GenericCommand { @@ -566,4 +582,5 @@ public TaskService initTaskService(Context context, InternalRuntimeManager ma protected boolean isUseLocking() { return useLocking; } + } diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManager.java index ba6155ee6c..0bb8d6a34f 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManager.java @@ -189,7 +189,7 @@ public void init() { TaskContentRegistry.get().addMarshallerContext(getIdentifier(), new ContentMarshallerContext(environment.getEnvironment(), environment.getClassLoader())); configureRuntimeOnTaskService((InternalTaskService) taskServiceFactory.newTaskService(), null); - } + } private class PerRequestInitializer implements RuntimeEngineInitlializer { diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManager.java index a9e7751734..3f77554523 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManager.java @@ -22,6 +22,11 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import org.drools.core.command.impl.GenericCommand; +import org.drools.core.command.impl.KnowledgeCommandContext; +import org.drools.core.common.InternalKnowledgeRuntime; +import org.drools.core.runtime.process.InternalProcessRuntime; +import org.jbpm.process.instance.ProcessRuntimeImpl; import org.jbpm.services.task.impl.TaskContentRegistry; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.manager.Context; @@ -105,6 +110,47 @@ public void init() { attachManager(this.singleton); this.registry.register(this); } + + @Override + public void activate() { + super.activate(); + this.singleton.getKieSession().execute(new GenericCommand() { + + private static final long serialVersionUID = 4698203316007668876L; + + @Override + public Void execute(org.kie.internal.command.Context context) { + KieSession ksession = ((KnowledgeCommandContext) context).getKieSession(); + ksession.getEnvironment().set("Active", true); + + InternalProcessRuntime processRuntime = ((InternalKnowledgeRuntime) ksession).getProcessRuntime(); + ((ProcessRuntimeImpl) processRuntime).initProcessEventListeners(); + ((ProcessRuntimeImpl) processRuntime).initStartTimers(); + return null; + } + }); + + } + + @Override + public void deactivate() { + super.deactivate(); + this.singleton.getKieSession().execute(new GenericCommand() { + + private static final long serialVersionUID = 8099201526203340191L; + + @Override + public Void execute(org.kie.internal.command.Context context) { + KieSession ksession = ((KnowledgeCommandContext) context).getKieSession(); + ksession.getEnvironment().set("Active", false); + + InternalProcessRuntime processRuntime = ((InternalKnowledgeRuntime) ksession).getProcessRuntime(); + ((ProcessRuntimeImpl) processRuntime).removeProcessEventListeners(); + return null; + } + }); + + } @SuppressWarnings("rawtypes") @Override diff --git a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManagerTest.java b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManagerTest.java index defe11c124..eef8641795 100644 --- a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManagerTest.java +++ b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerCaseRuntimeManagerTest.java @@ -52,6 +52,7 @@ import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.task.UserGroupCallback; import org.kie.internal.io.ResourceFactory; +import org.kie.internal.runtime.manager.InternalRuntimeManager; import org.kie.internal.runtime.manager.context.CaseContext; import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext; @@ -433,4 +434,104 @@ public void beforeProcessStarted(ProcessStartedEvent event) { assertEquals(1, ksessionUsed.size()); assertEquals(ksession1Id, ksessionUsed.iterator().next().longValue()); } + + @Test + public void testSignalEventWithDeactivate() { + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("events/start-on-event.bpmn"), ResourceType.BPMN2) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newPerCaseRuntimeManager(environment); + assertNotNull(manager); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + KieSession ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } + + @Test(timeout=10000) + public void testTimerStartWithDeactivate() { + final CountDownProcessEventListener countDownListener = new CountDownProcessEventListener("Hello", 1); + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("BPMN2-TimerStart.bpmn2"), ResourceType.BPMN2) + .registerableItemsFactory(new DefaultRegisterableItemsFactory(){ + + @Override + public List getProcessEventListeners(RuntimeEngine runtime) { + + List listeners = super.getProcessEventListeners(runtime); + listeners.add(countDownListener); + return listeners; + } + + }) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newPerCaseRuntimeManager(environment); + assertNotNull(manager); + + countDownListener.waitTillCompleted(); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(2000); + + runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(); + + runtime1 = manager.getRuntimeEngine(CaseContext.get("Case-1")); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } } diff --git a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManagerTest.java b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManagerTest.java index 225aeb47a0..1f73c88b7c 100644 --- a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManagerTest.java +++ b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerProcessInstanceRuntimeManagerTest.java @@ -70,6 +70,7 @@ import org.kie.internal.process.CorrelationAwareProcessRuntime; import org.kie.internal.process.CorrelationKey; import org.kie.internal.process.CorrelationKeyFactory; +import org.kie.internal.runtime.manager.InternalRuntimeManager; import org.kie.internal.runtime.manager.TaskServiceFactory; import org.kie.internal.runtime.manager.context.CorrelationKeyContext; import org.kie.internal.runtime.manager.context.EmptyContext; @@ -1321,4 +1322,102 @@ public void testErrorThrowOfChildProcessOnParent() { manager.disposeRuntimeEngine(runtime); manager.close(); } + @Test + public void testSignalEventWithDeactivate() { + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("events/start-on-event.bpmn"), ResourceType.BPMN2) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newPerProcessInstanceRuntimeManager(environment); + assertNotNull(manager); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + KieSession ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } + @Test(timeout=10000) + public void testTimerStartWithDeactivate() { + final CountDownProcessEventListener countDownListener = new CountDownProcessEventListener("Hello", 1); + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("BPMN2-TimerStart.bpmn2"), ResourceType.BPMN2) + .registerableItemsFactory(new DefaultRegisterableItemsFactory(){ + + @Override + public List getProcessEventListeners(RuntimeEngine runtime) { + + List listeners = super.getProcessEventListeners(runtime); + listeners.add(countDownListener); + return listeners; + } + + }) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newPerProcessInstanceRuntimeManager(environment); + assertNotNull(manager); + + countDownListener.waitTillCompleted(); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(2000); + + runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(); + + runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } } diff --git a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManagerTest.java b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManagerTest.java index 4b77c6442b..45477d7fd7 100644 --- a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManagerTest.java +++ b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/PerRequestRuntimeManagerTest.java @@ -57,6 +57,7 @@ import org.kie.api.task.model.Task; import org.kie.api.task.model.TaskSummary; import org.kie.internal.io.ResourceFactory; +import org.kie.internal.runtime.manager.InternalRuntimeManager; import org.kie.internal.runtime.manager.context.EmptyContext; import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext; @@ -558,4 +559,49 @@ public void testMultiplePerRequestManagerFromSingleThread() { manager.close(); manager2.close(); } + + @Test + public void testSignalEventWithDeactivate() { + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("events/start-on-event.bpmn"), ResourceType.BPMN2) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newPerRequestRuntimeManager(environment); + assertNotNull(manager); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + KieSession ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } } diff --git a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManagerTest.java b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManagerTest.java index 1f8491b1f8..fab8dc4c92 100644 --- a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManagerTest.java +++ b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/SingletonRuntimeManagerTest.java @@ -21,7 +21,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -34,13 +33,11 @@ import org.drools.persistence.SingleSessionCommandService; import org.drools.persistence.jpa.OptimisticLockRetryInterceptor; import org.drools.persistence.jta.TransactionLockInterceptor; -import org.jbpm.process.audit.AuditLogService; -import org.jbpm.process.audit.JPAAuditLogService; import org.jbpm.process.instance.event.listeners.RuleAwareProcessEventLister; -import org.jbpm.runtime.manager.impl.DefaultRegisterableItemsFactory; import org.jbpm.runtime.manager.util.TestUtil; import org.jbpm.services.task.identity.JBossUserGroupCallbackImpl; import org.jbpm.test.util.AbstractBaseTest; +import org.jbpm.test.util.CountDownProcessEventListener; import org.jbpm.workflow.instance.WorkflowRuntimeException; import org.junit.After; import org.junit.Before; @@ -63,6 +60,7 @@ import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.task.TaskService; import org.kie.internal.io.ResourceFactory; +import org.kie.internal.runtime.manager.InternalRuntimeManager; import org.kie.internal.runtime.manager.context.EmptyContext; import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext; import org.kie.internal.task.api.UserGroupCallback; @@ -797,4 +795,105 @@ public void testInterceptorAfterRollback() throws Exception { // close manager which will close session maintained by the manager manager.close(); } + + @Test + public void testSignalEventWithDeactivate() { + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("events/start-on-event.bpmn"), ResourceType.BPMN2) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(environment); + assertNotNull(manager); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + KieSession ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + ksession1 = runtime1.getKieSession(); + + ksession1.signalEvent("SampleEvent", null); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } + + + @Test(timeout=10000) + public void testTimerStartWithDeactivate() { + final CountDownProcessEventListener countDownListener = new CountDownProcessEventListener("Hello", 1); + RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() + .newDefaultBuilder() + .userGroupCallback(userGroupCallback) + .addAsset(ResourceFactory.newClassPathResource("BPMN2-TimerStart.bpmn2"), ResourceType.BPMN2) + .registerableItemsFactory(new DefaultRegisterableItemsFactory(){ + + @Override + public List getProcessEventListeners(RuntimeEngine runtime) { + + List listeners = super.getProcessEventListeners(runtime); + listeners.add(countDownListener); + return listeners; + } + + }) + .get(); + + manager = RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(environment); + assertNotNull(manager); + + countDownListener.waitTillCompleted(); + + RuntimeEngine runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + + List logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).deactivate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(2000); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(1, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + ((InternalRuntimeManager) manager).activate(); + + countDownListener.reset(1); + countDownListener.waitTillCompleted(); + + runtime1 = manager.getRuntimeEngine(EmptyContext.get()); + + logs = runtime1.getAuditService().findProcessInstances(); + assertEquals(2, logs.size()); + manager.disposeRuntimeEngine(runtime1); + + } } diff --git a/jbpm-runtime-manager/src/test/resources/BPMN2-TimerStart.bpmn2 b/jbpm-runtime-manager/src/test/resources/BPMN2-TimerStart.bpmn2 new file mode 100644 index 0000000000..b8ac19d91e --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/BPMN2-TimerStart.bpmn2 @@ -0,0 +1,57 @@ + + + + + + + + + 1000ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/AbstractDeploymentService.java b/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/AbstractDeploymentService.java index ccf940e8e1..55d5b73c95 100644 --- a/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/AbstractDeploymentService.java +++ b/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/AbstractDeploymentService.java @@ -102,17 +102,17 @@ public void notifyOnUnDeploy(DeploymentUnit unit, DeployedUnit deployedUnit){ } } - public void notifyOnActivate(DeploymentUnit unit, DeployedUnit deployedUnit){ - DeploymentEvent event = new DeploymentEvent(unit.getIdentifier(), deployedUnit); + public void notifyOnActivate(DeploymentUnit unit, DeployedUnit deployedUnit){ + DeploymentEvent event = new DeploymentEvent(unit.getIdentifier(), deployedUnit); for (DeploymentEventListener listener : listeners) { listener.onActivate(event); } } public void notifyOnDeactivate(DeploymentUnit unit, DeployedUnit deployedUnit){ - DeploymentEvent event = new DeploymentEvent(unit.getIdentifier(), deployedUnit); + DeploymentEvent event = new DeploymentEvent(unit.getIdentifier(), deployedUnit); for (DeploymentEventListener listener : listeners) { listener.onDeactivate(event); - } + } } public void commonDeploy(DeploymentUnit unit, DeployedUnitImpl deployedUnit, RuntimeEnvironment environemnt, KieContainer kieContainer) { @@ -127,6 +127,7 @@ public void commonDeploy(DeploymentUnit unit, DeployedUnitImpl deployedUnit, Run RuntimeManager manager = null; deploymentsMap.put(unit.getIdentifier(), deployedUnit); ((SimpleRuntimeEnvironment) environemnt).addToEnvironment("IdentityProvider", identityProvider); + ((SimpleRuntimeEnvironment) environemnt).addToEnvironment("Active", deployedUnit.isActive()); try { switch (unit.getStrategy()) { diff --git a/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/KModuleDeploymentService.java b/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/KModuleDeploymentService.java index 2181b28a65..1ec0e8c061 100644 --- a/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/KModuleDeploymentService.java +++ b/jbpm-services/jbpm-kie-services/src/main/java/org/jbpm/kie/services/impl/KModuleDeploymentService.java @@ -76,6 +76,7 @@ import org.kie.internal.runtime.conf.ObjectModelResolver; import org.kie.internal.runtime.conf.ObjectModelResolverProvider; import org.kie.internal.runtime.conf.PersistenceMode; +import org.kie.internal.runtime.manager.InternalRuntimeManager; import org.kie.scanner.MavenRepository; import org.reflections.Reflections; import org.reflections.util.ConfigurationBuilder; @@ -526,8 +527,12 @@ public void activate(String deploymentId) { DeployedUnit deployed = getDeployedUnit(deploymentId); if (deployed != null) { ((DeployedUnitImpl)deployed).setActive(true); + + ((InternalRuntimeManager)deployed.getRuntimeManager()).activate(); + notifyOnActivate(deployed.getDeploymentUnit(), deployed); } + } @Override @@ -535,8 +540,11 @@ public void deactivate(String deploymentId) { DeployedUnit deployed = getDeployedUnit(deploymentId); if (deployed != null) { ((DeployedUnitImpl)deployed).setActive(false); + + ((InternalRuntimeManager)deployed.getRuntimeManager()).deactivate(); + notifyOnDeactivate(deployed.getDeploymentUnit(), deployed); - } + } }