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 0b4f07adb8..ebd61b9555 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 @@ -399,7 +399,7 @@ public static class ProcessJobContext implements JobContext { private JobHandle jobHandle; private Long sessionId; - private boolean newTimer; + private boolean isNew; public ProcessJobContext(final TimerInstance timer, final Trigger trigger, final Long processInstanceId, final InternalKnowledgeRuntime kruntime) { @@ -408,17 +408,17 @@ public ProcessJobContext(final TimerInstance timer, final Trigger trigger, final this.processInstanceId = processInstanceId; this.kruntime = kruntime; this.sessionId = timer.getSessionId(); - this.newTimer = true; + this.isNew = true; } public ProcessJobContext(final TimerInstance timer, final Trigger trigger, final Long processInstanceId, - final InternalKnowledgeRuntime kruntime, boolean newTimer) { + final InternalKnowledgeRuntime kruntime, boolean isNew) { this.timer = timer; this.trigger = trigger; this.processInstanceId = processInstanceId; this.kruntime = kruntime; this.sessionId = timer.getSessionId(); - this.newTimer = newTimer; + this.isNew = isNew; } public Long getProcessInstanceId() { @@ -457,9 +457,10 @@ public void setKnowledgeRuntime(InternalKnowledgeRuntime kruntime) { public InternalWorkingMemory getWorkingMemory() { return kruntime instanceof InternalWorkingMemory ? (InternalWorkingMemory)kruntime : null; } - - public boolean isNewTimer() { - return newTimer; + + @Override + public boolean isNew() { + return isNew; } } @@ -493,7 +494,7 @@ public void setParamaeters(Map paramaeters) { } @Override - public boolean isNewTimer() { + public boolean isNew() { return false; } diff --git a/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java b/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java index 5cc3b33614..d7b38b587f 100644 --- a/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java +++ b/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java @@ -401,9 +401,9 @@ public void removeEventListeners() { } @Override - protected void triggerCompleted(String type, boolean remove) { - if (this.slaCompliance == org.kie.api.runtime.process.ProcessInstance.SLA_PENDING) { - if (System.currentTimeMillis() > slaDueDate.getTime()) { + protected void triggerCompleted(String type, boolean remove) { + if (this.slaCompliance == org.kie.api.runtime.process.ProcessInstance.SLA_PENDING) { + if (System.currentTimeMillis() > slaDueDate.getTime()) { // completion of the node instance is after expected SLA due date, mark it accordingly this.slaCompliance = org.kie.api.runtime.process.ProcessInstance.SLA_VIOLATED; } else { diff --git a/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/TaskDeadlinesServiceImpl.java b/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/TaskDeadlinesServiceImpl.java index 163737a007..3562afb59e 100644 --- a/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/TaskDeadlinesServiceImpl.java +++ b/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/TaskDeadlinesServiceImpl.java @@ -82,8 +82,15 @@ public void setPersistenceContext(TaskPersistenceContext persistenceContext) { this.persistenceContext = persistenceContext; } + public void scheduleNew(long taskId, long deadlineId, long delay, DeadlineType type) { + schedule(taskId, deadlineId, delay, type, true); + } public void schedule(long taskId, long deadlineId, long delay, DeadlineType type) { + schedule(taskId, deadlineId, delay, type, false); + } + + public void schedule(long taskId, long deadlineId, long delay, DeadlineType type, boolean isNew) { Task task = persistenceContext.findTask(taskId); String deploymentId = task.getTaskData().getDeploymentId(); @@ -99,7 +106,7 @@ public void schedule(long taskId, long deadlineId, long delay, DeadlineType type 0, null, null ) ; - JobHandle handle = timerService.scheduleJob(deadlineJob, new TaskDeadlineJobContext(deadlineJob.getId(), task.getTaskData().getProcessInstanceId(), deploymentId), trigger); + JobHandle handle = timerService.scheduleJob(deadlineJob, new TaskDeadlineJobContext(deadlineJob.getId(), task.getTaskData().getProcessInstanceId(), deploymentId, isNew), trigger); jobHandles.put(deadlineJob.getId(), handle); } else { @@ -363,13 +370,24 @@ private static class TaskDeadlineJobContext implements NamedJobContext { private String jobName; private Long processInstanceId; private String deploymentId; + private boolean isNew; public TaskDeadlineJobContext(String jobName, Long processInstanceId, String deploymentId) { + this(jobName, processInstanceId, deploymentId, false); + } + + public TaskDeadlineJobContext(String jobName, Long processInstanceId, String deploymentId, boolean isNew) { this.jobName = jobName; this.processInstanceId = processInstanceId; this.deploymentId = deploymentId; + this.isNew = isNew; } + @Override + public boolean isNew() { + return isNew; + } + @Override public void setJobHandle(JobHandle jobHandle) { this.jobHandle = jobHandle; diff --git a/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/util/DeadlineSchedulerHelper.java b/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/util/DeadlineSchedulerHelper.java index 276d3d20c4..95122592ab 100644 --- a/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/util/DeadlineSchedulerHelper.java +++ b/jbpm-human-task/jbpm-human-task-core/src/main/java/org/jbpm/services/task/impl/util/DeadlineSchedulerHelper.java @@ -138,7 +138,7 @@ public static void scheduleDeadlines(final List deadlines, f for (Deadline deadline : deadlines) { if (Boolean.FALSE.equals(deadline.isEscalated())) { Date date = deadline.getDate(); - deadlineService.schedule(taskId, deadline.getId(), date.getTime() - now, type); + deadlineService.scheduleNew(taskId, deadline.getId(), date.getTime() - now, type); } } } diff --git a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/migration/MigrationManager.java b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/migration/MigrationManager.java index 9e131161b5..e462611e0c 100644 --- a/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/migration/MigrationManager.java +++ b/jbpm-runtime-manager/src/main/java/org/jbpm/runtime/manager/impl/migration/MigrationManager.java @@ -16,8 +16,10 @@ package org.jbpm.runtime.manager.impl.migration; +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; + import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -25,6 +27,10 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; @@ -142,12 +148,20 @@ public MigrationReport migrate(Map nodeMapping) { boolean migrateExecutorJobs = ((SimpleRuntimeEnvironment)currentManager.getEnvironment()).getEnvironmentTemplate().get("ExecutorService") != null; validate(migrateExecutorJobs); Map> timerMigrated = null; + Map> stateBasedTimer = null; + Map> slaTimerMigrated = null; + Map> humanTaskSuspended = null; + TimerInstance slaProcessInstance = null; try { // collect and cancel any active timers before migration - timerMigrated = cancelActiveTimersBeforeMigration(currentManager); - - // start transaction to secure consistency of the migration + timerMigrated = cancelActiveTimersBeforeMigration(currentManager, TimerNodeInstance.class, active -> asList(active.getTimerId())); + stateBasedTimer = cancelActiveTimersBeforeMigration(currentManager, StateBasedNodeInstance.class, active -> active.getTimerInstances()); + slaTimerMigrated = cancelActiveTimersBeforeMigration(currentManager, org.jbpm.workflow.instance.impl.NodeInstanceImpl.class, active -> asList(active.getSlaTimerId())); + humanTaskSuspended = cancelActiveTimersBeforeMigration(currentManager, HumanTaskNodeInstance.class, active -> asList((active.getSuspendUntilTimerId()))); + slaProcessInstance = cancelSLAActiveTimerProcessInstance(currentManager); + + // start transaction to secure consistency of the migration txm = TransactionManagerFactory.get().newTransactionManager(currentManager.getEnvironment().getEnvironment()); transactionOwner = txm.begin(); @@ -254,9 +268,14 @@ public MigrationReport migrate(Map nodeMapping) { tobe = toBeManager.getEnvironment().getKieBase().newKieSession(); upgradeProcessInstance(current, tobe, migrationSpec.getProcessInstanceId(), migrationSpec.getToProcessId(), nodeMapping, em, toBeManager.getIdentifier()); - if (!timerMigrated.isEmpty()) { - rescheduleTimersAfterMigration(toBeManager, timerMigrated); - } + + // reschedule timers + rescheduleTimersAfterMigration(toBeManager, TimerNodeInstance.class, timerMigrated, (active, timers) -> active.internalSetTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(toBeManager, StateBasedNodeInstance.class, stateBasedTimer, (active, timers) -> active.internalSetTimerInstances(timers.stream().map(TimerInstance::getId).collect(Collectors.toList()))); + rescheduleTimersAfterMigration(toBeManager, org.jbpm.workflow.instance.impl.NodeInstanceImpl.class, slaTimerMigrated, (active, timers) -> active.internalSetSlaTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(toBeManager, HumanTaskNodeInstance.class, humanTaskSuspended, (active, timers) -> active.setSuspendUntilTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(toBeManager, slaProcessInstance); + em.flush(); } finally { em.clear(); @@ -270,10 +289,12 @@ public MigrationReport migrate(Map nodeMapping) { } catch (Throwable e) { txm.rollback(transactionOwner); logger.error("Unexpected error during migration", e); - // put back timers (if there are any) in case of rollback - if (timerMigrated != null && !timerMigrated.isEmpty()) { - rescheduleTimersAfterMigration(currentManager, timerMigrated); - } + + rescheduleTimersAfterMigration(currentManager, TimerNodeInstance.class, timerMigrated, (active, timers) -> active.internalSetTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(currentManager, StateBasedNodeInstance.class, stateBasedTimer, (active, timers) -> active.internalSetTimerInstances(timers.stream().map(TimerInstance::getId).collect(Collectors.toList()))); + rescheduleTimersAfterMigration(currentManager, org.jbpm.workflow.instance.impl.NodeInstanceImpl.class, slaTimerMigrated, (active, timers) -> active.internalSetSlaTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(currentManager, HumanTaskNodeInstance.class, humanTaskSuspended, (active, timers) -> active.setSuspendUntilTimerId(toSingletonTimerId(timers))); + rescheduleTimersAfterMigration(currentManager, slaProcessInstance); report.addEntry(Type.ERROR, "Migration of process instance (" + migrationSpec.getProcessInstanceId() + ") failed due to " + e.getMessage()); } finally { @@ -297,6 +318,10 @@ public MigrationReport migrate(Map nodeMapping) { return report; } + + private Long toSingletonTimerId(List timerInstances) { + return (timerInstances.isEmpty()) ? -1 : timerInstances.get(0).getId(); + } private void validate(boolean migrateExecutorJobs) { if (migrationSpec == null) { @@ -356,7 +381,7 @@ private void validate(boolean migrateExecutorJobs) { if (migrateExecutorJobs) { List executorJobs = (List) em.createQuery("select id FROM RequestInfo ri WHERE ri.processInstanceId = :processInstanceId and ri.status in (:statuses)") .setParameter("processInstanceId", migrationSpec.getProcessInstanceId()) - .setParameter("statuses", Arrays.asList(STATUS.QUEUED, STATUS.RETRYING, STATUS.RUNNING)) + .setParameter("statuses", asList(STATUS.QUEUED, STATUS.RETRYING, STATUS.RUNNING)) .getResultList(); if (!executorJobs.isEmpty()) { @@ -569,7 +594,68 @@ protected TimerManager getTimerManager(KieSession ksession) { return ((InternalProcessRuntime) ((StatefulKnowledgeSessionImpl) internal).getProcessRuntime()).getTimerManager(); } - protected Map> cancelActiveTimersBeforeMigration(RuntimeManager manager) { + protected TimerInstance cancelSLAActiveTimerProcessInstance(RuntimeManager manager) { + RuntimeEngine engineBefore = manager.getRuntimeEngine(ProcessInstanceIdContext.get(migrationSpec.getProcessInstanceId())); + try { + TimerInstance timerMigrated = engineBefore.getKieSession().execute(new ExecutableCommand() { + + @Override + public TimerInstance execute(Context context) { + KieSession kieSession = ((RegistryContext) context).lookup(KieSession.class); + TimerManager timerManager = getTimerManager(kieSession); + WorkflowProcessInstanceImpl processInstance = (WorkflowProcessInstanceImpl) kieSession.getProcessInstance(migrationSpec.getProcessInstanceId()); + if (processInstance.getSlaTimerId() > 0) { + TimerInstance timerInstance = timerManager.getTimerMap().get(processInstance.getSlaTimerId()); + if (timerInstance != null) { + timerManager.cancelTimer(processInstance.getId(), timerInstance.getId()); + } + + return timerInstance; + } + return null; + } + + }); + return timerMigrated; + } finally { + manager.disposeRuntimeEngine(engineBefore); + } + + } + + protected void rescheduleTimersAfterMigration(RuntimeManager manager, TimerInstance timerMigrated) { + if(timerMigrated == null) { + return; + } + + RuntimeEngine engine = manager.getRuntimeEngine(ProcessInstanceIdContext.get(migrationSpec.getProcessInstanceId())); + try { + engine.getKieSession().execute(new ExecutableCommand() { + + @Override + public Void execute(Context context) { + KieSession kieSession = ((RegistryContext) context).lookup(KieSession.class); + + TimerManager timerManager = getTimerManager(kieSession); + + WorkflowProcessInstanceImpl processInstance = (WorkflowProcessInstanceImpl) kieSession.getProcessInstance(migrationSpec.getProcessInstanceId()); + + long delay = timerMigrated.getDelay() - (System.currentTimeMillis() - timerMigrated.getActivated().getTime()); + timerMigrated.setDelay(delay); + + updateBasedOnTrigger(timerMigrated); + + timerManager.registerTimer(timerMigrated, processInstance); + + processInstance.internalSetSlaTimerId(timerMigrated.getId()); + return null; + }}); + } finally { + manager.disposeRuntimeEngine(engine); + } + } + + protected Map> cancelActiveTimersBeforeMigration(RuntimeManager manager, Class type, Function> getTimerInstances ) { RuntimeEngine engineBefore = manager.getRuntimeEngine(ProcessInstanceIdContext.get(migrationSpec.getProcessInstanceId())); try { Map> timerMigrated = engineBefore.getKieSession().execute(new ExecutableCommand>>() { @@ -589,27 +675,31 @@ public Map> execute(Context context) { Collection activeInstances = processInstance.getNodeInstances(true); for (org.jbpm.workflow.instance.NodeInstance active : activeInstances) { - if (active instanceof TimerNodeInstance) { - TimerInstance timerInstance = timerManager.getTimerMap().get(((TimerNodeInstance) active).getTimerId()); - - timerManager.cancelTimer(processInstance.getId(), timerInstance.getId()); - result.put(active.getId(), Arrays.asList(timerInstance)); - } else if (active instanceof StateBasedNodeInstance) { - List timers = ((StateBasedNodeInstance) active).getTimerInstances(); - - if (timers != null && !timers.isEmpty()) { - List collected = new ArrayList<>(); - for (Long timerId : timers) { - TimerInstance timerInstance = timerManager.getTimerMap().get(timerId); - if (timerInstance==null) { - report.addEntry(Type.WARN, "Could not find timer instance with id "+timerId+" to cancel."); - continue; - } - timerManager.cancelTimer(processInstance.getId(), timerInstance.getId()); - collected.add(timerInstance); - } - result.put(active.getId(), collected); + if (!type.isAssignableFrom(active.getClass())) { + continue; + } + + List timers = getTimerInstances.apply(type.cast(active)); + if (timers == null) { + continue; + } + + List collected = new ArrayList<>(); + for (Long timerId : timers) { + if (timerId == -1) { + continue; } + + TimerInstance timerInstance = timerManager.getTimerMap().get(timerId); + if (timerInstance == null) { + report.addEntry(Type.WARN, "Could not find timer instance with id " + timerId + " to cancel."); + continue; + } + timerManager.cancelTimer(processInstance.getId(), timerInstance.getId()); + collected.add(timerInstance); + } + if (!collected.isEmpty()) { + result.put(active.getId(), collected); } } @@ -623,12 +713,16 @@ public Map> execute(Context context) { } } - protected void rescheduleTimersAfterMigration(RuntimeManager manager, Map> timerMigrated) { + protected void rescheduleTimersAfterMigration(RuntimeManager manager, Class nodeType, Map> timersToMigrate, BiConsumer> timerMigrated) { + if(timersToMigrate.isEmpty()) { + return; + } + RuntimeEngine engine = manager.getRuntimeEngine(ProcessInstanceIdContext.get(migrationSpec.getProcessInstanceId())); try { engine.getKieSession().execute(new ExecutableCommand() { - private static final long serialVersionUID = 7144657913971146080L; + private static final long serialVersionUID = 7144357923971146089L; @Override public Void execute(Context context) { @@ -637,35 +731,25 @@ public Void execute(Context context) { WorkflowProcessInstanceImpl processInstance = (WorkflowProcessInstanceImpl) kieSession.getProcessInstance(migrationSpec.getProcessInstanceId()); - for (Entry> entry : timerMigrated.entrySet()) { + for (Entry> entry : timersToMigrate.entrySet()) { org.jbpm.workflow.instance.NodeInstance active = processInstance.getNodeInstance(entry.getKey(), true); - if (active instanceof TimerNodeInstance) { - TimerInstance timerInstance = entry.getValue().get(0); - + if(!nodeType.isAssignableFrom(active.getClass())) { + continue; + } + + List timerInstances = entry.getValue(); + for (TimerInstance timerInstance : timerInstances) { long delay = timerInstance.getDelay() - (System.currentTimeMillis() - timerInstance.getActivated().getTime()); timerInstance.setDelay(delay); updateBasedOnTrigger(timerInstance); - - timerManager.registerTimer(timerInstance, processInstance); - ((TimerNodeInstance) active).internalSetTimerId(timerInstance.getId()); - } else if (active instanceof StateBasedNodeInstance) { - - List timerInstances = entry.getValue(); - List timers = new ArrayList<>(); - for (TimerInstance timerInstance : timerInstances) { - long delay = timerInstance.getDelay() - (System.currentTimeMillis() - timerInstance.getActivated().getTime()); - timerInstance.setDelay(delay); - - updateBasedOnTrigger(timerInstance); - - timerManager.registerTimer(timerInstance, processInstance); - timers.add(timerInstance.getId()); - } - ((StateBasedNodeInstance) active).internalSetTimerInstances(timers); + timerManager.registerTimer(timerInstance, processInstance); } + + timerMigrated.accept(nodeType.cast(active), timerInstances); + } return null; @@ -697,4 +781,4 @@ protected void updateBasedOnTrigger(TimerInstance timerInstance) { } } -} +} \ No newline at end of file diff --git a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/migration/TimerMigrationManagerTest.java b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/migration/TimerMigrationManagerTest.java index 0c7da595c9..8d5949f47d 100644 --- a/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/migration/TimerMigrationManagerTest.java +++ b/jbpm-runtime-manager/src/test/java/org/jbpm/runtime/manager/impl/migration/TimerMigrationManagerTest.java @@ -20,6 +20,11 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.kie.api.runtime.manager.audit.NodeInstanceLog.TYPE_ENTER; +import static org.kie.api.runtime.manager.audit.NodeInstanceLog.TYPE_EXIT; +import static org.kie.api.runtime.process.ProcessInstance.SLA_MET; +import static org.kie.api.runtime.process.ProcessInstance.SLA_PENDING; +import static org.kie.api.runtime.process.ProcessInstance.SLA_VIOLATED; import static org.kie.api.runtime.process.ProcessInstance.STATE_ACTIVE; import static org.kie.api.runtime.process.ProcessInstance.STATE_COMPLETED; @@ -34,6 +39,8 @@ import javax.persistence.EntityManagerFactory; import org.jbpm.process.audit.JPAAuditLogService; +import org.jbpm.process.audit.NodeInstanceLog; +import org.jbpm.process.audit.ProcessInstanceLog; import org.jbpm.process.instance.impl.demo.DoNothingWorkItemHandler; import org.jbpm.runtime.manager.impl.DefaultRegisterableItemsFactory; import org.jbpm.runtime.manager.impl.jpa.EntityManagerFactoryManager; @@ -41,7 +48,9 @@ import org.jbpm.services.task.identity.JBossUserGroupCallbackImpl; import org.jbpm.services.task.impl.TaskDeadlinesServiceImpl; import org.jbpm.test.listener.process.NodeLeftCountDownProcessEventListener; +import org.jbpm.test.listener.process.SLAViolationCountDownProcessEventListener; import org.jbpm.test.util.AbstractBaseTest; +import org.jbpm.workflow.instance.NodeInstance; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -56,9 +65,9 @@ import org.kie.api.runtime.manager.RuntimeEnvironmentBuilder; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.manager.RuntimeManagerFactory; -import org.kie.api.runtime.manager.audit.ProcessInstanceLog; import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.runtime.process.WorkItemHandler; +import org.kie.api.runtime.process.WorkflowProcessInstance; import org.kie.api.task.TaskService; import org.kie.api.task.model.TaskSummary; import org.kie.internal.io.ResourceFactory; @@ -114,6 +123,19 @@ public TimerMigrationManagerTest(String strategy) { private static final String USERTASK_BOUNDARY_TIMER_ID_V1 = "UserTaskBoundary-v1"; private static final String USERTASK_BOUNDARY_TIMER_ID_V2 = "UserTaskBoundary-v2"; + + private static final String USERTASK_SLA_ID_V1 = "BPMN2-UserTaskSLA-v1"; + private static final String USERTASK_SLA_ID_V2 = "BPMN2-UserTaskSLA-v2"; + + private static final String PROCESS_SLA_ID_V1 = "BPMN2-ProcessSLA-v1"; + private static final String PROCESS_SLA_ID_V2 = "BPMN2-ProcessSLA-v2"; + + private static final String SLA_PROCESS_ID_V1 = "processSLA-V1"; + private static final String SLA_PROCESS_ID_V2 = "processSLA-V2"; + + private static final String SLA_ON_TASK_ID_V1 = "SLAOnTask-v1"; + private static final String SLA_ON_TASK_ID_V2 = "SLAOnTask-v2"; + private JPAAuditLogService auditService; private RuntimeEngine runtime; private long pid; @@ -157,14 +179,14 @@ public void testMigrateTimerProcessInstance() throws Exception { assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess(TIMER_ID_V1); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(TIMER_ID_V1, log.getProcessId()); @@ -191,7 +213,6 @@ public void testMigrateTimerProcessInstance() throws Exception { countdownListener.waitTillCompleted(); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(TIMER_ID_V2, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); @@ -206,14 +227,14 @@ public void testMigrateBoundaryTimerProcessInstance() throws Exception { assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess(BOUNDARY_TIMER_ID_V1); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(BOUNDARY_TIMER_ID_V1, log.getProcessId()); @@ -240,7 +261,6 @@ public void testMigrateBoundaryTimerProcessInstance() throws Exception { countdownListener.waitTillCompleted(); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(BOUNDARY_TIMER_ID_V2, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); @@ -255,14 +275,14 @@ public void testMigrateEventSubprocessTimerProcessInstance() throws Exception { assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess(EVENT_SUBPROCESS_TIMER_ID_V1); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(EVENT_SUBPROCESS_TIMER_ID_V1, log.getProcessId()); @@ -289,7 +309,6 @@ public void testMigrateEventSubprocessTimerProcessInstance() throws Exception { countdownListener.waitTillCompleted(); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(EVENT_SUBPROCESS_TIMER_ID_V2, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); @@ -298,21 +317,21 @@ public void testMigrateEventSubprocessTimerProcessInstance() throws Exception { } @SuppressWarnings({"unchecked", "rawtypes"}) - @Test(timeout=10000) + @Test//(timeout=10000) public void testMigrateTimerProcessInstanceRollback() throws Exception { NodeLeftCountDownProcessEventListener countdownListener = new NodeLeftCountDownProcessEventListener("Event", 1); createRuntimeManagers("migration/v1/BPMN2-Timer-v1.bpmn2", "migration/v2/BPMN2-Timer-v2.bpmn2", countdownListener); assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess(TIMER_ID_V1); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(TIMER_ID_V1, log.getProcessId()); @@ -345,7 +364,6 @@ public void testMigrateTimerProcessInstanceRollback() throws Exception { countdownListener.waitTillCompleted(); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(TIMER_ID_V1, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V1, log.getExternalId()); @@ -360,7 +378,7 @@ public void testMigrateTimerCycleProcessInstance() throws Exception { assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); @@ -368,7 +386,7 @@ public void testMigrateTimerCycleProcessInstance() throws Exception { ProcessInstance pi1 = ksession.startProcess(CYCLE_TIMER_ID_V1, params); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(CYCLE_TIMER_ID_V1, log.getProcessId()); @@ -407,7 +425,6 @@ public void testMigrateTimerCycleProcessInstance() throws Exception { managerV2.disposeRuntimeEngine(runtime); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(CYCLE_TIMER_ID_V2, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); @@ -422,7 +439,7 @@ public void testMigrateTimerCycleProcessInstanceBeforeFirstTrigger() throws Exce assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); @@ -431,7 +448,7 @@ public void testMigrateTimerCycleProcessInstanceBeforeFirstTrigger() throws Exce ProcessInstance pi1 = ksession.startProcess(CYCLE_TIMER_ID_V1, params); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(CYCLE_TIMER_ID_V1, log.getProcessId()); @@ -466,7 +483,6 @@ public void testMigrateTimerCycleProcessInstanceBeforeFirstTrigger() throws Exce managerV2.disposeRuntimeEngine(runtime); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(CYCLE_TIMER_ID_V2, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); @@ -481,14 +497,14 @@ public void testMigrateTimerWithLoopProcessInstance() throws Exception { assertNotNull(managerV1); assertNotNull(managerV2); - RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess(LOOP_TIMER_ID_V1); assertNotNull(pi1); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); - JPAAuditLogService auditService = new JPAAuditLogService(emf); + auditService = new JPAAuditLogService(emf); ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); assertNotNull(log); assertEquals(LOOP_TIMER_ID_V1, log.getProcessId()); @@ -545,7 +561,6 @@ public void testMigrateTimerWithLoopProcessInstance() throws Exception { countdownListener.waitTillCompleted(); log = auditService.findProcessInstance(pi1.getId()); - auditService.dispose(); assertNotNull(log); assertEquals(LOOP_TIMER_ID_V1, log.getProcessId()); assertEquals(DEPLOYMENT_ID_V1, log.getExternalId()); @@ -589,6 +604,194 @@ public void testMigrateUserTaskNotCompletedBoundaryTimerProcessInstance() throws checkProcessCompleted(countdownListener); } + + @Test(timeout=10000) + public void testMigrateSLAProcessTimer() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAProcess-v1.bpmn2", + "migration/v2/BPMN2-SLAProcess-v2.bpmn2", + SLA_PROCESS_ID_V1, + countdownListener); + migrate(pi, SLA_PROCESS_ID_V2); + + //wait till timer fires because SLA is violated + countdownListener.waitTillCompleted(); + + assertSLAProcessCompliance(pi, SLA_VIOLATED); + } + + @Test(timeout=10000) + public void testMigrateAfterSLAProcessTimer() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAProcess-v1.bpmn2", + "migration/v2/BPMN2-SLAProcess-v2.bpmn2", + SLA_PROCESS_ID_V1, + countdownListener); + + //wait till timer fires because SLA is violated, before migration + countdownListener.waitTillCompleted(); + + migrate(pi, SLA_PROCESS_ID_V2); + assertSLAProcessCompliance(pi, SLA_VIOLATED); + } + + @Test(timeout=10000) + public void testMigrateAndCompleteSLAProcessTimer() throws Exception { + NodeLeftCountDownProcessEventListener countdownListener = new NodeLeftCountDownProcessEventListener("Script Task 2", 1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAProcess-v1.bpmn2", + "migration/v2/BPMN2-SLAProcess-v2.bpmn2", + SLA_PROCESS_ID_V1, + countdownListener); + migrate(pi, SLA_PROCESS_ID_V2); + assertSLAProcessCompliance(pi, SLA_PENDING); + + completeUserTask(managerV2, USER_JOHN); + // wait till process is completed + countdownListener.waitTillCompleted(); + assertSLAProcessCompliance(pi, SLA_MET); + } + + @Test(timeout=10000) + public void testMigrateSLAOnTaskTimer() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAOnTask-v1.bpmn2", + "migration/v2/BPMN2-SLAOnTask-v2.bpmn2", + SLA_ON_TASK_ID_V1, + countdownListener); + migrate(pi, SLA_ON_TASK_ID_V2); + + //wait till timer fires because SLA is violated + countdownListener.waitTillCompleted(); + assertSLAOnTaskCompliance(pi, TYPE_ENTER, SLA_VIOLATED); + } + + @Test(timeout=10000) + public void testMigrateAfterSLAOnTaskTimer() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAOnTask-v1.bpmn2", + "migration/v2/BPMN2-SLAOnTask-v2.bpmn2", + SLA_ON_TASK_ID_V1, + countdownListener); + //wait till timer fires because SLA is violated, before migration + countdownListener.waitTillCompleted(); + + migrate(pi, SLA_ON_TASK_ID_V2); + assertSLAOnTaskCompliance(pi, TYPE_ENTER, SLA_VIOLATED); + } + + @Test(timeout=10000) + public void testMigrateAndCompleteSLAOnTaskTimer() throws Exception { + NodeLeftCountDownProcessEventListener countdownListener = new NodeLeftCountDownProcessEventListener("Script Task 2", 1); + ProcessInstance pi = startSLAProcess("migration/v1/BPMN2-SLAOnTask-v1.bpmn2", + "migration/v2/BPMN2-SLAOnTask-v2.bpmn2", + SLA_ON_TASK_ID_V1, + countdownListener); + migrate(pi, SLA_ON_TASK_ID_V2); + assertSLAOnTaskCompliance(pi, TYPE_ENTER, SLA_PENDING); + + completeUserTask(managerV2, USER_JOHN); + // wait till process is completed + countdownListener.waitTillCompleted(); + assertSLAOnTaskCompliance(pi, TYPE_EXIT, SLA_MET); + } + + @Test(timeout=10000) + public void testUserTaskSLA() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + createRuntimeManagers("migration/v1/BPMN2-UserTaskSLA-v1.bpmn2", "migration/v2/BPMN2-UserTaskSLA-v2.bpmn2", countdownListener); + assertNotNull(managerV1); + assertNotNull(managerV2); + + RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + KieSession ksession = runtime.getKieSession(); + assertNotNull(ksession); + + ProcessInstance pi1 = ksession.startProcess(USERTASK_SLA_ID_V1); + assertNotNull(pi1); + assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); + JPAAuditLogService auditService = new JPAAuditLogService(emf); + ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); + assertNotNull(log); + assertEquals(USERTASK_SLA_ID_V1, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V1, log.getExternalId()); + + managerV1.disposeRuntimeEngine(runtime); + + MigrationSpec migrationSpec = new MigrationSpec(DEPLOYMENT_ID_V1, pi1.getId(), DEPLOYMENT_ID_V2, USERTASK_SLA_ID_V2); + + MigrationManager migrationManager = new MigrationManager(migrationSpec); + MigrationReport report = migrationManager.migrate(); + + assertNotNull(report); + assertTrue(report.isSuccessful()); + + log = auditService.findProcessInstance(pi1.getId()); + assertNotNull(log); + assertEquals(USERTASK_SLA_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + assertEquals(ProcessInstance.STATE_ACTIVE, log.getStatus().intValue()); + + + // wait till timer fires + countdownListener.waitTillCompleted(); + + log = auditService.findProcessInstance(pi1.getId()); + auditService.dispose(); + assertNotNull(log); + assertEquals(USERTASK_SLA_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + assertEquals(ProcessInstance.STATE_ACTIVE, log.getStatus().intValue()); + + } + + @Test(timeout=10000) + public void testProcessSLA() throws Exception { + SLAViolationCountDownProcessEventListener countdownListener = new SLAViolationCountDownProcessEventListener(1); + createRuntimeManagers("migration/v1/BPMN2-ProcessSLA-v1.bpmn2", "migration/v2/BPMN2-ProcessSLA-v2.bpmn2", countdownListener); + assertNotNull(managerV1); + assertNotNull(managerV2); + + RuntimeEngine runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + KieSession ksession = runtime.getKieSession(); + assertNotNull(ksession); + + ProcessInstance pi1 = ksession.startProcess(PROCESS_SLA_ID_V1); + assertNotNull(pi1); + assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); + JPAAuditLogService auditService = new JPAAuditLogService(emf); + ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); + assertNotNull(log); + assertEquals(PROCESS_SLA_ID_V1, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V1, log.getExternalId()); + + managerV1.disposeRuntimeEngine(runtime); + + MigrationSpec migrationSpec = new MigrationSpec(DEPLOYMENT_ID_V1, pi1.getId(), DEPLOYMENT_ID_V2, PROCESS_SLA_ID_V2); + + MigrationManager migrationManager = new MigrationManager(migrationSpec); + MigrationReport report = migrationManager.migrate(); + + assertNotNull(report); + assertTrue(report.isSuccessful()); + + log = auditService.findProcessInstance(pi1.getId()); + assertNotNull(log); + assertEquals(PROCESS_SLA_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + assertEquals(ProcessInstance.STATE_ACTIVE, log.getStatus().intValue()); + + + // wait till timer fires + countdownListener.waitTillCompleted(); + + log = auditService.findProcessInstance(pi1.getId()); + auditService.dispose(); + assertNotNull(log); + assertEquals(PROCESS_SLA_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + assertEquals(ProcessInstance.STATE_ACTIVE, log.getStatus().intValue()); + + } protected void createRuntimeManagers(String processV1, String processV2, ProcessEventListener...eventListeners) { RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get() @@ -703,7 +906,7 @@ private void checkProcess(long pid, String processId, } private void migrateProcessUserTaskBoundary(RuntimeManager manager) { - RuntimeEngine runtime = manager.getRuntimeEngine(EmptyContext.get()); + runtime = manager.getRuntimeEngine(EmptyContext.get()); manager.disposeRuntimeEngine(runtime); MigrationSpec migrationSpec = new MigrationSpec(DEPLOYMENT_ID_V1, pid, DEPLOYMENT_ID_V2, USERTASK_BOUNDARY_TIMER_ID_V2); @@ -714,7 +917,7 @@ private void migrateProcessUserTaskBoundary(RuntimeManager manager) { } private void completeUserTask(RuntimeManager manager, String user) { - RuntimeEngine runtime = manager.getRuntimeEngine(EmptyContext.get()); + runtime = manager.getRuntimeEngine(EmptyContext.get()); TaskService taskService = runtime.getTaskService(); List tasks = taskService.getTasksAssignedAsPotentialOwner(user, "en-UK"); assertNotNull(tasks); @@ -735,7 +938,75 @@ private void checkProcessCompleted(NodeLeftCountDownProcessEventListener countdo countdownListener.waitTillCompleted(); checkProcess(pid, USERTASK_BOUNDARY_TIMER_ID_V2, DEPLOYMENT_ID_V2, STATE_COMPLETED); + } + + protected ProcessInstance startSLAProcess(String processV1, String processV2, String processId, ProcessEventListener countdownListener) { + createRuntimeManagers(processV1, processV2, countdownListener); + assertNotNull(managerV1); + assertNotNull(managerV2); - auditService.dispose(); + runtime = managerV1.getRuntimeEngine(EmptyContext.get()); + KieSession ksession = runtime.getKieSession(); + assertNotNull(ksession); + + ProcessInstance pi1 = ksession.startProcess(processId); + assertNotNull(pi1); + assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); + auditService = new JPAAuditLogService(emf); + ProcessInstanceLog log = auditService.findProcessInstance(pi1.getId()); + assertNotNull(log); + assertEquals(processId, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V1, log.getExternalId()); + + managerV1.disposeRuntimeEngine(runtime); + return pi1; + } + + protected void migrate(ProcessInstance pid, String processId) { + MigrationSpec migrationSpec = new MigrationSpec(DEPLOYMENT_ID_V1, pid.getId(), DEPLOYMENT_ID_V2, processId); + + MigrationManager migrationManager = new MigrationManager(migrationSpec); + MigrationReport report = migrationManager.migrate(); + + assertNotNull(report); + assertTrue(report.isSuccessful()); + } + + protected void assertSLAProcessCompliance(ProcessInstance pi, int compliance) { + ProcessInstanceLog log = auditService.findProcessInstance(pi.getId()); + assertNotNull(log); + + assertEquals(SLA_PROCESS_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + assertEquals(compliance, (int)log.getSlaCompliance()); + } + + protected void assertSLAOnTaskCompliance(ProcessInstance pi, int type, int compliance) { + ProcessInstanceLog log = auditService.findProcessInstance(pi.getId()); + assertNotNull(log); + + assertEquals(SLA_ON_TASK_ID_V2, log.getProcessId()); + assertEquals(DEPLOYMENT_ID_V2, log.getExternalId()); + + Collection activeNodes = ((WorkflowProcessInstance)pi).getNodeInstances(); + assertEquals(1, activeNodes.size()); + + int sla = getSLAComplianceForNodeInstance(auditService, pi.getId(), + (org.jbpm.workflow.instance.NodeInstance) activeNodes.iterator().next(), + type); + assertEquals(compliance, sla); + } + + protected int getSLAComplianceForNodeInstance(JPAAuditLogService logService, long processInstanceId, NodeInstance nodeInstance, int logType) { + int slaCompliance = -1; + List logs = logService.findNodeInstances(processInstanceId); + if (logs != null) { + for (NodeInstanceLog log : logs) { + if (log.getType() == logType && log.getNodeInstanceId().equals(String.valueOf(nodeInstance.getId()))) { + return log.getSlaCompliance(); + } + } + } + return slaCompliance; } } diff --git a/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-ProcessSLA-v1.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-ProcessSLA-v1.bpmn2 new file mode 100644 index 0000000000..14c8d0fa4b --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-ProcessSLA-v1.bpmn2 @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + + + + _1-_2 + _2-_3 + + + + + _2_TaskNameInputX + _2_SkippableInputX + + + + _2_TaskNameInputX + + + + + + + _2_SkippableInputX + + + + + + + + john + + + + + + + + + + _2-_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _xI_0QCs8EDy3G-EZm5NgUw + _xI_0QCs8EDy3G-EZm5NgUw + + diff --git a/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAOnTask-v1.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAOnTask-v1.bpmn2 new file mode 100644 index 0000000000..063fffab88 --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAOnTask-v1.bpmn2 @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + 2s + + + + + + System.out.println("Entering on Hello v1"); + + + _1-_2 + SequenceFlow_1 + + + + DataInput_8 + + + + + DataInput_8 + + en-UK + DataInput_8 + + + + + john + + + + + + + + + + SequenceFlow_2 + + + + + + + + + + SequenceFlow_1 + SequenceFlow_2 + System.out.println("Goodbye v1"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAProcess-v1.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAProcess-v1.bpmn2 new file mode 100644 index 0000000000..f76a09560e --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-SLAProcess-v1.bpmn2 @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SequenceFlow_1 + + + + + + + + _1B1A6982-058C-4ABE-91FB-0C0E77A86A50 + + + + + + + + _1B1A6982-058C-4ABE-91FB-0C0E77A86A50 + _C7E0225D-0F85-474C-8B35-B32D7F47D6B3 + + + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + DataInput_6 + + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + + + + DataInput_6 + + en-UK + DataInput_6 + + + + + john + + + + + + + + + + _C7E0225D-0F85-474C-8B35-B32D7F47D6B3 + SequenceFlow_1 + System.out.println("End of SLA Timer 1"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-UserTaskSLA-v1.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-UserTaskSLA-v1.bpmn2 new file mode 100644 index 0000000000..3255d53f9f --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v1/BPMN2-UserTaskSLA-v1.bpmn2 @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + + + + + + + _1-_2 + _2-_3 + + + + + _2_TaskNameInputX + _2_SkippableInputX + + + + _2_TaskNameInputX + + + + + + + _2_SkippableInputX + + + + + + + + john + + + + + + + + + + _2-_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _bDDtUCs7EDyU3ILCRECaIg + _bDDtUCs7EDyU3ILCRECaIg + + diff --git a/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-ProcessSLA-v2.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-ProcessSLA-v2.bpmn2 new file mode 100644 index 0000000000..fa60461bb2 --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-ProcessSLA-v2.bpmn2 @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + + + + _1-_2 + _2-_3 + + + + + _2_TaskNameInputX + _2_SkippableInputX + + + + _2_TaskNameInputX + + + + + + + _2_SkippableInputX + + + + + + + + john + + + + + + + + + + _2-_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3levgCs8EDyjMtruot-ztw + _3levgCs8EDyjMtruot-ztw + + diff --git a/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAOnTask-v2.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAOnTask-v2.bpmn2 new file mode 100644 index 0000000000..0ad27f91f9 --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAOnTask-v2.bpmn2 @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + 2s + + + + + + System.out.println("Entering on Hello v2"); + + + _1-_2 + SequenceFlow_1 + + + + DataInput_8 + + + + + DataInput_8 + + en-UK + DataInput_8 + + + + + john + + + + + + + + + + SequenceFlow_2 + + + + + + + + + + SequenceFlow_1 + SequenceFlow_2 + System.out.println("Goodbye v2"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAProcess-v2.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAProcess-v2.bpmn2 new file mode 100644 index 0000000000..eef6cd9362 --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-SLAProcess-v2.bpmn2 @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SequenceFlow_1 + + + + + + + + _1B1A6982-058C-4ABE-91FB-0C0E77A86A50 + + + + + + + + _1B1A6982-058C-4ABE-91FB-0C0E77A86A50 + _C7E0225D-0F85-474C-8B35-B32D7F47D6B3 + + + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + DataInput_6 + + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_TaskNameInputX + + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + + + _7B93533E-C018-4DEA-A603-2B63E8878A29_SkippableInputX + + + + DataInput_6 + + en-UK + DataInput_6 + + + + + john + + + + + + + + + + _C7E0225D-0F85-474C-8B35-B32D7F47D6B3 + SequenceFlow_1 + System.out.println("End of SLA Timer 2"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-UserTaskSLA-v2.bpmn2 b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-UserTaskSLA-v2.bpmn2 new file mode 100644 index 0000000000..2dbcdce0d8 --- /dev/null +++ b/jbpm-runtime-manager/src/test/resources/migration/v2/BPMN2-UserTaskSLA-v2.bpmn2 @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + _1-_2 + + + + + + + + + + + _1-_2 + _2-_3 + + + + + _2_TaskNameInputX + _2_SkippableInputX + + + + _2_TaskNameInputX + + + + + + + _2_SkippableInputX + + + + + + + + john + + + + + + + + + + _2-_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _T9P9sCs6EDyfboU5usA46A + _T9P9sCs6EDyfboU5usA46A + + diff --git a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EjbSchedulerService.java b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EjbSchedulerService.java index 12b341fe20..421be2affd 100644 --- a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EjbSchedulerService.java +++ b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EjbSchedulerService.java @@ -68,7 +68,7 @@ public JobHandle scheduleJob(Job job, JobContext ctx, Trigger trigger) { TimerJobInstance jobInstance = null; // check if given timer job is marked as new timer meaning it was never scheduled before, // if so skip the check by timer name as it has no way to exist - if (!isNewTimer(ctx)) { + if (!ctx.isNew()) { jobInstance = getTimerJobInstance(jobName); if (jobInstance == null) { jobInstance = scheduler.getTimerByName(jobName); @@ -216,7 +216,7 @@ public boolean isValid(GlobalJobHandle jobHandle) { protected String getJobName(JobContext ctx, long id) { return JobNameHelper.getJobName(ctx, id); } - + @Override public void setEnvironment(RuntimeEnvironment environment) {