本实例演示怎样使用activiti中的定时器事件和java服务任务。流程启动后(同时设置两个定时器的触发时间),等待第一个定时器事件触发,然后进入下一个任务,然后结束该任务(通过线程来模拟)且修改第二个定时器事件的时间,等待第二个定时器被触发,执行下一个java服务任务,最后结束。
本实例的目的是为了证明定时器事件的时间是可以动态进行设置的,这在工作中非常重要。流程图如下:

activiti配置文件内容如下(activiti.cfg.xml):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="aaaaaa" /> <property name="jobExecutorActivate" value="true" /> <property name="databaseType" value="mysql"/> <property name="databaseSchemaUpdate" value="false" /> <property name="history" value="full"/> </bean> </beans>
流程定义XML文件内容如下(startTimerEvent01.bpmn20.xml):
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="https://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="https://activiti.org/bpmn" xmlns:bpmndi="https://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="https://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="https://www.omg.org/spec/DD/20100524/DI" typeLanguage="https://www.w3.org/2001/XMLSchema" expressionLanguage="https://www.w3.org/1999/XPath" targetNamespace="https://www.activiti.org/processdef">
<process id="startTimerEvent01" name="定时器开始事件" isExecutable="true">
<startEvent id="start" name="开始"></startEvent>
<intermediateCatchEvent id="waitTimer1">
<timerEventDefinition>
<timeDate>${myDate1}</timeDate>
</timerEventDefinition>
</intermediateCatchEvent>
<serviceTask id="checkLog" name="检查日志" activiti:expression="${myBean.execute()}"></serviceTask>
<endEvent id="sid-FB551A38-B458-488B-8887-DA7A73A1D937" name="结束"></endEvent>
<userTask id="userTask" name="用户任务"></userTask>
<intermediateCatchEvent id="waitTimer2">
<timerEventDefinition>
<timeDate>${myDate2}</timeDate>
</timerEventDefinition>
</intermediateCatchEvent>
<sequenceFlow id="flow01" sourceRef="start" targetRef="waitTimer1"></sequenceFlow>
<sequenceFlow id="flow02" sourceRef="waitTimer1" targetRef="userTask"></sequenceFlow>
<sequenceFlow id="flow03" sourceRef="userTask" targetRef="waitTimer2"></sequenceFlow>
<sequenceFlow id="flow4" sourceRef="waitTimer2" targetRef="checkLog"></sequenceFlow>
<sequenceFlow id="flow05" sourceRef="checkLog" targetRef="sid-FB551A38-B458-488B-8887-DA7A73A1D937"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_startTimerEvent01">
<bpmndi:BPMNPlane bpmnElement="startTimerEvent01" id="BPMNPlane_startTimerEvent01">
<bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
<omgdc:Bounds height="30.0" width="30.0" x="160.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="waitTimer1" id="BPMNShape_waitTimer1">
<omgdc:Bounds height="30.0" width="30.0" x="235.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="checkLog" id="BPMNShape_checkLog">
<omgdc:Bounds height="80.0" width="100.0" x="545.0" y="105.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-FB551A38-B458-488B-8887-DA7A73A1D937" id="BPMNShape_sid-FB551A38-B458-488B-8887-DA7A73A1D937">
<omgdc:Bounds height="28.0" width="28.0" x="690.0" y="131.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="userTask" id="BPMNShape_userTask">
<omgdc:Bounds height="80.0" width="100.0" x="315.0" y="105.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="waitTimer2" id="BPMNShape_waitTimer2">
<omgdc:Bounds height="30.0" width="30.0" x="475.0" y="130.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="505.0" y="145.0"></omgdi:waypoint>
<omgdi:waypoint x="545.0" y="145.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow01" id="BPMNEdge_flow01">
<omgdi:waypoint x="190.0" y="145.0"></omgdi:waypoint>
<omgdi:waypoint x="235.0" y="145.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow02" id="BPMNEdge_flow02">
<omgdi:waypoint x="265.0" y="145.0"></omgdi:waypoint>
<omgdi:waypoint x="315.0" y="145.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow03" id="BPMNEdge_flow03">
<omgdi:waypoint x="415.0" y="145.0"></omgdi:waypoint>
<omgdi:waypoint x="475.0" y="145.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow05" id="BPMNEdge_flow05">
<omgdi:waypoint x="645.0" y="145.0"></omgdi:waypoint>
<omgdi:waypoint x="690.0" y="145.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>activiti的java服务任务调用的普通javabean代码如下(MyBeanStartTimerEvent.java):
package com.bug315.bean;
import java.io.Serializable;
public class MyBeanStartTimerEvent implements Serializable {
private static final long serialVersionUID = 1L;
public void execute(){
System.out.println("execute()");
}
}客户端java代码如下(StartTimerEvent01.java):
package com.bug315;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.ProcessEngineImpl;
import org.activiti.engine.task.Task;
import com.bug315.bean.MyBeanStartTimerEvent;
public class StartTimerEvent01 {
public static void main(String[] args) throws Exception {
ProcessEngineImpl engine = (ProcessEngineImpl)ProcessEngines.getDefaultProcessEngine();
// 启动JobExecutor
System.out.println("启动JobExecutor...");
engine.getProcessEngineConfiguration().getJobExecutor().start();
RepositoryService repositoryService = engine.getRepositoryService();
RuntimeService runtimeService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 部署流程
System.out.println("部署流程...");
repositoryService.createDeployment().addClasspathResource("bpmn/startTimerEvent01.bpmn20.xml").deploy();
// 启动流程
System.out.println("开始启动流程...");
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("myDate1", "2015-02-25T20:34:00");
variables.put("myDate2", "2015-02-25T20:35:00");
variables.put("myBean", new MyBeanStartTimerEvent());
runtimeService.startProcessInstanceByKey("startTimerEvent01", variables);
// 查询第一个任务(需要等到第一个定时器触发后才能得到任务)
Thread.sleep(1000*60);
Task task = taskService.createTaskQuery().singleResult();
System.out.println("task = " + task);
System.out.println("任务ID:" + task.getId() + " 任务名称:" + task.getName());
taskService.complete(task.getId());
// 重置第二个定时器的时间
Thread.sleep(1000 * 5);
Map<String, Object> variables2 = new HashMap<String, Object>();
variables2.put("myDate2", "2015-02-25T20:37:00");
runtimeService.setVariables(task.getExecutionId(), variables2);
// 流程结束
System.out.println("流程结束...");
}
}运行结果如下:
启动JobExecutor...
部署流程...
4750 [main] INFO org.activiti.engine.impl.bpmn.deployer.BpmnDeployer - Processing resource bpmn/startTimerEvent01.bpmn20.xml
开始启动流程...
task = Task[id=1407, name=用户任务]
任务ID:1407 任务名称:用户任务
流程结束...
execute() // 注意:这个是activiti java服务任务调用后的输出的