提交 8e2242ca 编写于 作者: T Tijs Rademakers

Merge branch 'TASK_TIMEOUT' of https://github.com/martin-grofcik/Activiti

......@@ -72,20 +72,40 @@ public class TimerExecuteNestedActivityJobHandler implements JobHandler {
if (boundaryActivityBehavior instanceof BoundaryEventActivityBehavior) {
BoundaryEventActivityBehavior boundaryEventActivityBehavior = (BoundaryEventActivityBehavior) boundaryActivityBehavior;
if (boundaryEventActivityBehavior.isInterrupting()) {
ActivityImpl activity = execution.getActivity();
if (activity != null && activity.getActivityBehavior() != null) {
commandContext.getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createActivityEvent(ActivitiEventType.ACTIVITY_TIMEOUT, execution.getActivity().getId(),
(String) activity.getProperties().get("name"),
execution.getId(),
execution.getProcessInstanceId(), execution.getProcessDefinitionId(),
(String) activity.getProperties().get("type"),
activity.getActivityBehavior().getClass().getCanonicalName()));
}
dispatchExecutionTimeOut(execution, commandContext);
}
}
}
protected void dispatchExecutionTimeOut(ExecutionEntity execution, CommandContext commandContext) {
// subprocesses
for (ExecutionEntity subExecution : execution.getExecutions()) {
dispatchExecutionTimeOut(subExecution, commandContext);
}
// call activities
ExecutionEntity subProcessInstance = commandContext.getExecutionEntityManager().findSubProcessInstanceBySuperExecutionId(execution.getId());
if (subProcessInstance != null) {
dispatchExecutionTimeOut(subProcessInstance, commandContext);
}
// activity with timer boundary event
ActivityImpl activity = execution.getActivity();
if (activity != null && activity.getActivityBehavior() != null) {
dispatchActivityTimeOut(activity, execution, commandContext);
}
}
protected void dispatchActivityTimeOut(ActivityImpl activity, ExecutionEntity execution, CommandContext commandContext) {
commandContext.getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createActivityEvent(ActivitiEventType.ACTIVITY_TIMEOUT, activity.getId(),
(String) activity.getProperties().get("name"),
execution.getId(),
execution.getProcessInstanceId(), execution.getProcessDefinitionId(),
(String) activity.getProperties().get("type"),
activity.getActivityBehavior().getClass().getCanonicalName())
);
}
}
......@@ -12,19 +12,17 @@
*/
package org.activiti.engine.test.api.event;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import org.activiti.engine.delegate.event.ActivitiActivityEvent;
import org.activiti.engine.delegate.event.ActivitiErrorEvent;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.ActivitiMessageEvent;
import org.activiti.engine.delegate.event.ActivitiSignalEvent;
import org.activiti.engine.delegate.event.*;
import org.activiti.engine.delegate.event.impl.ActivitiActivityEventImpl;
import org.activiti.engine.event.EventLogEntry;
import org.activiti.engine.impl.event.logger.EventLogger;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
......@@ -472,9 +470,81 @@ public class ActivityEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getProcessDefinitionId(), errorEvent.getProcessDefinitionId());
assertFalse(processInstance.getId().equals(errorEvent.getExecutionId()));
}
protected void assertDatabaseEventPresent(ActivitiEventType eventType) {
@Deployment(resources = "org/activiti/engine/test/api/event/JobEventsTest.testJobEntityEvents.bpmn20.xml")
public void testActivityTimeOutEvent(){
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testJobEvents");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar tomorrow = Calendar.getInstance();
tomorrow.add(Calendar.DAY_OF_YEAR, 1);
processEngineConfiguration.getClock().setCurrentTime(tomorrow.getTime());
waitForJobExecutorToProcessAllJobs(2000, 100);
// Check timeout has been dispatched
assertEquals(1, listener.getEventsReceived().size());
ActivitiEvent timeOutEvent = listener.getEventsReceived().get(0);
assertEquals("ACTIVITY_TIMEOUT evet expected", ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
}
@Deployment(resources = "org/activiti/engine/test/bpmn/event/timer/BoundaryTimerEventTest.testTimerOnNestingOfSubprocesses.bpmn20.xml")
public void testActivityTimeOutEventInSubProcess() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("timerOnNestedSubprocesses");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar timeToFire = Calendar.getInstance();
timeToFire.add(Calendar.HOUR, 2);
timeToFire.add(Calendar.SECOND, 5);
processEngineConfiguration.getClock().setCurrentTime(timeToFire.getTime());
waitForJobExecutorToProcessAllJobs(2000, 100);
// Check timeout-events have been dispatched
assertEquals(3, listener.getEventsReceived().size());
ActivitiActivityEventImpl timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerTask1", timeOutEvent.getActivityId());
timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerTask2", timeOutEvent.getActivityId());
timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerFork", timeOutEvent.getActivityId());
}
@Deployment
public void testActivityTimeOutEventInCallActivity() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("timerOnCallActivity");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar timeToFire = Calendar.getInstance();
timeToFire.add(Calendar.HOUR, 2);
timeToFire.add(Calendar.SECOND, 5);
processEngineConfiguration.getClock().setCurrentTime(timeToFire.getTime());
waitForJobExecutorToProcessAllJobs(200000, 100);
// Check timeout-events have been dispatched
assertEquals(4, listener.getEventsReceived().size());
ActivitiActivityEventImpl timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerTask1", timeOutEvent.getActivityId());
timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerTask2", timeOutEvent.getActivityId());
timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("innerFork", timeOutEvent.getActivityId());
timeOutEvent = (ActivitiActivityEventImpl) listener.getEventsReceived().get(3);
assertEquals(ActivitiEventType.ACTIVITY_TIMEOUT, timeOutEvent.getType());
assertEquals("callActivity", timeOutEvent.getActivityId());
}
protected void assertDatabaseEventPresent(ActivitiEventType eventType) {
String eventTypeString = eventType.name();
List<EventLogEntry> eventLogEntries = managementService.getEventLogEntries(0L, 100000L);
boolean found = false;
......
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="timerOnCallActivity">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="callActivity" />
<sequenceFlow id="flow3" sourceRef="callActivity" targetRef="theEnd" />
<callActivity id="callActivity" calledElement="subprocess"/>
<boundaryEvent id="boundaryTimer" cancelActivity="true" attachedToRef="callActivity">
<timerEventDefinition>
<timeDuration>PT2H</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<sequenceFlow id="flow2" sourceRef="boundaryTimer" targetRef="taskAfterCatch" />
<userTask id="taskAfterCatch" name="task outside subprocess" />
<endEvent id="theEnd" />
</process>
<process id="subprocess">
<startEvent id="subprocessStart"/>
<sequenceFlow id="subFlow1" sourceRef="subprocessStart" targetRef="innerSubprocess"/>
<subProcess id="innerSubprocess">
<startEvent id="innerSubprocessStart"/>
<sequenceFlow id="innerSubFlow1" sourceRef="innerSubprocessStart" targetRef="innerFork"/>
<parallelGateway id="innerFork"/>
<sequenceFlow id="innerSubFlow2" sourceRef="innerFork" targetRef="innerTask1"/>
<sequenceFlow id="innerSubFlow3" sourceRef="innerFork" targetRef="innerTask2"/>
<userTask id="innerTask1" name="Inner subprocess task 1"/>
<userTask id="innerTask2" name="Inner subprocess task 2"/>
</subProcess>
</process>
</definitions>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册