Skip to content

Commit

Permalink
JBPM-5322 - Timer continue to start even after deactivating of deploy…
Browse files Browse the repository at this point in the history
…ment (#607)
  • Loading branch information
mswiderski committed Oct 7, 2016
1 parent 1066b47 commit 77f16fb
Show file tree
Hide file tree
Showing 14 changed files with 566 additions and 19 deletions.
Expand Up @@ -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<Process> processes = kbase.getProcesses();
for (Process process : processes) {
Expand All @@ -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() {
Expand Down Expand Up @@ -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()) {
Expand Down Expand Up @@ -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 {

Expand Down
Expand Up @@ -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(
Expand All @@ -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());
Expand Down
Expand Up @@ -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);

}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Expand Up @@ -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<Void> {
Expand Down Expand Up @@ -566,4 +582,5 @@ public TaskService initTaskService(Context<?> context, InternalRuntimeManager ma
protected boolean isUseLocking() {
return useLocking;
}

}
Expand Up @@ -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 {

Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Void>() {

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<Void>() {

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
Expand Down
Expand Up @@ -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;

Expand Down Expand Up @@ -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<? extends ProcessInstanceLog> 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<ProcessEventListener> getProcessEventListeners(RuntimeEngine runtime) {

List<ProcessEventListener> 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<? extends ProcessInstanceLog> 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);

}
}

0 comments on commit 77f16fb

Please sign in to comment.