之前做的一个项目因为流程需求改动频繁,导致修改工作量极大。这次又要开发一个流程性质的项目。考虑使用工作流引擎。在权衡几种工作流引擎的之后,考虑学习使用比较热门的activiti。、
首先在maven中加入activiti的依赖,如果和Spring配合使用的话,有两个
<!--activiti work flow -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activyty.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activyty.version}</version>
</dependency>
然后在在Spring的配置文件中加入:
<!-- Activiti处理引擎的配置,交由Spring管理 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<!-- 配置数据源,和系统使用同一个数据源 -->
<property name="dataSource" ref="dataSource" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<!-- 统一的事务管理 -->
<property name="transactionManager" ref="transactionManager" />
<property name="deploymentResources" value="classpath*:/activiti/*.bpmn20.xml" />
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService" />
这里的dataSource 是我在项目中的数据源,这样的话activiti的表会和项目的表在同一个数据库中。事务管理器也是使用同一个,activiti的事务可以和业务逻辑事务同步。
然后关注下面的几个bean。
repositoryService 是activiti管理静态资源的服务,利用它可以部署和管理流程文件。
runtimeService 运行时服务,可以启动一个工作流过程实例。
taskService 任务管理服务,获取或者是完成任务。
historyService 历史记录服务。
然后在写一个idInfo.bpmn20.xml放在resource的activiti目录下(目录可以随意,和配置中的deploymentResources项一样就行,它会自动在这个目录下面找对应的文件部署)
<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns:activiti="http://activiti.org/bpmn"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<process id="financialReport" name="Monthly financial report reminderprocess">
<startEvent id="theStart" />
<!--顺序流 可以加条件-->
<sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask' />
<userTask id="writeReportTask" name="Write monthly financial report" >
<documentation>
Write monthly financial reportfor publication to shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>sales</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' />
<userTask id="verifyReportTask" name="Verify monthly financial report" >
<documentation>
Verify monthly financial reportcomposed by the accountancy department.
This financial report is goingto be sent to all the company shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' />
<endEvent id="theEnd" />
</process>
</definitions>
然后就可以开始进行测试了,先执行下面的测试代码(我在Junit环境下跑的)
//processEngine 已通过注解注入获得
log.debug("name is " + processEngine.getName());
TaskService taskService = processEngine.getTaskService();
//FormService formService = processEngine.getFormService();
HistoryService historyService = processEngine.getHistoryService();
// 部署流程定义
// RepositoryService repositoryService = processEngine.getRepositoryService();
// repositoryService.createDeployment().addClasspathResource("activiti/idInfo.bpmn20.xml").deploy();
// 启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
String procId = runtimeService.startProcessInstanceByKey("financialReport").getId();
// 获得第一个任务
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("sales").list();
for (Task task : tasks) {
System.out.println("Following task is available for sales group: " + task.getName());
// 认领任务这里由foozie认领,因为fozzie是sales组的成员
taskService.claim(task.getId(), "fozzie");
}
// 查看fozzie现在是否能够获取到该任务
tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
for (Task task : tasks) {
System.out.println("Task for fozzie: " + task.getName());
// 执行(完成)任务
taskService.complete(task.getId());
}
// 现在fozzie的可执行任务数就为0了
System.out.println("Number of tasks for fozzie: "
+ taskService.createTaskQuery().taskAssignee("fozzie").count());
// 获得第二个任务
tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
for (Task task : tasks) {
System.out.println("Following task is available for accountancy group:" + task.getName());
// 认领任务这里由kermit认领,因为kermit是management组的成员
taskService.claim(task.getId(), "kermit");
}
// 完成第二个任务结束流程
for (Task task : tasks) {
taskService.complete(task.getId());
}
// 核实流程是否结束,输出流程结束时间
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(procId).singleResult();
System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());
以上就是简单的activiti入门使用过程。
网友评论