在前面两节,咱们介绍了如何部署activiti三个应用以及如何使用第三方数据库,若是你还没阅读前两章也不影响本文的阅读,若是有兴趣了解下,能够点击如下连接java
从本章开始,就正式开始activiti程序开发,咱们先从一个最简单的activiti流程开发,流程图以下:mysql
流程很简单,发起后,由管理员admin
审批,而后结束。git
bpmn源文件代码以下github
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <process id="SimpleProcess" name="SimpleProcess" isExecutable="true"> <startEvent id="startEvent1"></startEvent> <userTask id="sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8" name="Admin Approver" activiti:assignee="admin"> <extensionElements> <modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee> <modeler:assignee-info-email xmlns:modeler="http://activiti.com/modeler"><![CDATA[admin]]></modeler:assignee-info-email> <modeler:assignee-info-lastname xmlns:modeler="http://activiti.com/modeler"><![CDATA[Administrator]]></modeler:assignee-info-lastname> <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete> </extensionElements> </userTask> <sequenceFlow id="sid-F506EEC7-0411-4A97-930D-87500FF1414F" sourceRef="startEvent1" targetRef="sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8"></sequenceFlow> <endEvent id="sid-2C31753A-3AE2-4C91-B4F8-3B5EED2B4FC5"></endEvent> <sequenceFlow id="sid-9FC989EE-BBC3-4EB2-A7AF-DA4F2649A68F" sourceRef="sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8" targetRef="sid-2C31753A-3AE2-4C91-B4F8-3B5EED2B4FC5"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_SimpleProcess"> <bpmndi:BPMNPlane bpmnElement="SimpleProcess" id="BPMNPlane_SimpleProcess"> <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1"> <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8" id="BPMNShape_sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8"> <omgdc:Bounds height="80.0" width="100.0" x="255.0" y="138.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-2C31753A-3AE2-4C91-B4F8-3B5EED2B4FC5" id="BPMNShape_sid-2C31753A-3AE2-4C91-B4F8-3B5EED2B4FC5"> <omgdc:Bounds height="28.0" width="28.0" x="465.0" y="164.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-F506EEC7-0411-4A97-930D-87500FF1414F" id="BPMNEdge_sid-F506EEC7-0411-4A97-930D-87500FF1414F"> <omgdi:waypoint x="130.0" y="178.0"></omgdi:waypoint> <omgdi:waypoint x="255.0" y="178.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-9FC989EE-BBC3-4EB2-A7AF-DA4F2649A68F" id="BPMNEdge_sid-9FC989EE-BBC3-4EB2-A7AF-DA4F2649A68F"> <omgdi:waypoint x="355.0" y="178.0"></omgdi:waypoint> <omgdi:waypoint x="465.0" y="178.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
你可使用任何一个支持BPMN2.0的工具进行流程的建模,若是你是用eclipse开发,activiti在eclipse下有一个很是好用的插件,而且activit也提供一个web版的建模工具,就在activiti-app这个应用下,关于如何部署该应用,你能够查看以前的文章SpringBoot Activiti6系列教程(一)-activiti-app部署。以上模型就是经过activiti-app建立导出的。web
Spring Boot是一个应用开发框架,基于spring,相比spring开发,spring boot极大简化了配置,而且遵照约定优于配置的原则即便0配置也能正常运行,这在spring中是不可思议的。spring boot应用程序能够独立运行,框架内嵌web容器,使得web应用程序能够像本地程序同样启动和调试,十分的方便,这种设计方式也使得spring boot应用程序很是适合容器化进行大规模部署,并且spring boot提供了很是丰富的组件,流行的java web框架基本都有spring boot版本,生态十分庞大,是目前java web开发最好的方案。spring
若是你已经对spring boot很是熟悉,能够跳过该章节。
本次教程代码都是经过IntelliJ IDEA
进行开发,基于Spring Boot 2.1.2
版本,若是你还没用过IntelliJ IDEA,建议你尝试下。
1.
建立一个maven
工程2.
设置项目parent而且加入spring boot的依赖和activiti相关依赖,参考pom.xml以下pom.xmlsql
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.definesys.tutorial.activiti</groupId> <artifactId>activiti-tutorial</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>activiti-tutorial1</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.185</version> </dependency> </dependencies> </project>
spring-boot-starter-web
是spring boot用来建立rest服务的组件,h2是一个内存数据库,若是你没有配置数据库,那么加入h2后,无需配置第三方数据库便可运行activit应用。数据库
3.
在resource
文件夹下建立文件夹processes
(文件夹名字不能修改),而且将第一步建立的模型文件拷贝至该文件下。4.
建立两个接口,/acitiviti/start
能够发起该流程,/activiti/task?uid=admin
能够查询admin的流程待办,依次建立appliaction,dto,service,controller相关代码文件,以下本文全部代码已上传至github,仓库地址为 https://github.com/wls1036/springboot-activiti6-tutorial 欢迎star
ActivititiApplication.javaexpress
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) public class ActivititiApplication { public static void main(String[] args) { SpringApplication.run(ActivititiApplication.class); } }
之因此要加exclude = SecurityAutoConfiguration.class
,缘由是不加的话启动会报Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
错误,多是spring boot的版本缘由引发的。
TaskRepresentation.javaapache
public class TaskRepresentation { private String id; private String name; public TaskRepresentation(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ActivitiService.java
@Service public class ActivitiService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; /** * start activiti process * * @return instance id */ public String start() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("SimpleProcess"); return instance.getId(); } /** * get user task list * * @param uid * @return user task list */ public List<Task> getTask(String uid) { List<Task> tasks = taskService.createTaskQuery().taskAssignee(uid).list(); return tasks; } }
RuntimeService
包含了activiti运行时接口,能够经过点击进入查看源文件,acitivi api设计的至关友好,不少接口看名称就差很少知道功能,startProcessInstanceByKey是根据流程编号发起流程,参数为bpmn文件中 process id="SimpleProcess"
中的id字段。
TaskService
包含任务相关api,createTaskQuery能够建立一个任务查询,activiti的api使用方法基本都同样,好比查询类的,都是createXXXQuery建立一个查询类后执行查询条件,list()是返回一个list数组。这里是指定审批人,在bpmn文件中,咱们指定了审批人为admin
<userTask id="sid-2B2AA039-82D2-479C-8FE9-6F48E4478BD8" name="Admin Approver" activiti:assignee="admin">
ActivitiController
@RestController @RequestMapping(value = "activiti") public class ActivitiController { @Autowired private ActivitiService service; @RequestMapping(value = "start", method = RequestMethod.GET) public String start() { return service.start(); } @RequestMapping(value = "task", method = RequestMethod.GET) public List<TaskRepresentation> getTask(@RequestParam(value = "uid") String uid) { List<Task> tasks = service.getTask(uid); List<TaskRepresentation> dtos = new ArrayList<>(); for (Task task : tasks) { dtos.add(new TaskRepresentation(task.getId(), task.getName())); } return dtos; } }
curl http://localhost:8080/activiti/start 65
curl http://localhost:8080/activiti/task?uid=admin [{"id":"65","name":"Admin Approver"}]
如今的数据都保存到内存数据库h2中,程序从新启动就会丢失,这显然不是咱们想要的结果,咱们须要将数据保存到外部数据库,关于如何初始化外部数据库,能够参考以前的文章SpringBoot Activiti6系列教程(二)-基于mysql数据库初始化,这里不在赘述。假设你已经初始化完数据库。
@Configuration public class ActivitiConfiguration { @Bean public DataSource database() { return DataSourceBuilder.create() .url("jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8") .username("activiti") .password("definesys") .driverClassName("com.mysql.jdbc.Driver") .build(); } }
这里为了简单把链接信息写死在代码里,不是一种好的方式,你能够将链接信息放到application.properties里。
.... <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
从新调用start
接口后,流程发起后,会在数据库表ACT_RU_TASK
中建立记录。
本文介绍了一个最简单的activiti流程在spring boot中的应用。
本文全部代码已经上传至github,仓库地址为 https://github.com/wls1036/springboot-activiti6-tutorial欢迎star