springboot activiti工作流简单示例
最近一直研究springboot,根据工作需求,工作流需要作为一个单独的微服务工程来提供给其他服务调用,现在简单的写下工作流(使用的activiti)微服务的搭建与简单使用jdk:1.8数据库:mysql 5.7IDE:eclipsespringboot:1.5.8activiti:6.0.01.新建空白的maven微服务架构新建maven项目的流程不在阐述,这里添加上activiti、myslq
最近一直研究springboot,根据工作需求,工作流需要作为一个单独的微服务工程来提供给其他服务调用,现在简单的写下工作流(使用的activiti)微服务的搭建与简单使用
jdk:1.8
数据库:mysql 5.7
IDE:eclipse
springboot:1.5.8
activiti:6.0.0
1.新建空白的maven微服务架构
新建maven项目的流程不在阐述,这里添加上activiti、myslq连接的依赖,只贴主要代码
pox.xml
-
<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.xxx</groupId> -
<artifactId>xxx</artifactId> -
<version>0.0.1-SNAPSHOT</version> -
<properties> -
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> -
<java.version>1.8</java.version> -
</properties> -
<parent> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-parent</artifactId> -
<version>1.5.8.RELEASE</version> -
</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>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-data-jpa</artifactId> -
</dependency> -
<dependency> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-thymeleaf</artifactId> -
</dependency> -
<dependency> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-web</artifactId> -
</dependency> -
<dependency> -
<groupId>mysql</groupId> -
<artifactId>mysql-connector-java</artifactId> -
<scope>runtime</scope> -
</dependency> -
<dependency> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-tomcat</artifactId> -
</dependency> -
<dependency> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-starter-test</artifactId> -
<scope>test</scope> -
</dependency> -
</dependencies> -
<build> -
<plugins> -
<plugin> -
<groupId>org.springframework.boot</groupId> -
<artifactId>spring-boot-maven-plugin</artifactId> -
</plugin> -
</plugins> -
</build> -
</project>
确认服务是可用
2.连接服务名、服务端口、数据库配置
在resources目录下的application.properties(项目定位原因没有使用yaml,可根据自己项目使用)
-
spring.datasource.driver-class-name=com.mysql.jdbc.Driver -
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activity?characterEncoding=utf8&useSSL=true -
spring.datasource.username=root -
spring.datasource.password=root -
spring.jpa.properties.hibernate.hbm2ddl.auto=update -
spring.jpa.show-sql=true -
server.port=8081 -
server.context-path=/activity -
server.session.timeout=10 -
server.tomcat.uri-encoding=UTF-8
确认配置的数据库可用
3.main
-
import org.springframework.boot.SpringApplication; -
import org.springframework.boot.autoconfigure.SpringBootApplication; -
/** -
* Created by Guo on 2017/11/15. -
*/ -
@SpringBootApplication -
public class ActivityApp -
{ -
public static void main(String[] args) -
{ -
SpringApplication.run(ActivityApp.class, args); -
} -
}
4.service及实现
service:
-
import org.activiti.engine.task.TaskQuery; -
import org.springframework.web.bind.annotation.RequestMapping; -
import org.springframework.web.bind.annotation.RequestMethod; -
import org.springframework.web.bind.annotation.RestController; -
@RestController -
@RequestMapping("/activityService") -
public interface ActivityConsumerService { -
/** -
* 流程demo -
* @return -
*/ -
@RequestMapping(value="/startActivityDemo",method=RequestMethod.GET) -
public boolean startActivityDemo(); -
}
impl
-
import java.util.HashMap; -
import java.util.Map; -
import org.activiti.engine.RuntimeService; -
import org.activiti.engine.TaskService; -
import org.activiti.engine.impl.persistence.entity.ExecutionEntity; -
import org.activiti.engine.task.Task; -
import org.activiti.engine.task.TaskQuery; -
import org.apache.commons.lang3.StringUtils; -
import org.springframework.beans.factory.annotation.Autowired; -
import org.springframework.stereotype.Service; -
import com.hongguaninfo.activity.service.ActivityConsumerService; -
@Service("activityService") -
public class ActivityConsumerServiceImpl implements ActivityConsumerService { -
@Autowired -
private RuntimeService runtimeService; -
@Autowired -
private TaskService taskService; -
@Override -
public boolean startActivityDemo() { -
System.out.println("method startActivityDemo begin...."); -
Map<String,Object> map = new HashMap<String,Object>(); -
map.put("apply","zhangsan"); -
map.put("approve","lisi"); -
//流程启动 -
ExecutionEntity pi1 = (ExecutionEntity) runtimeService.startProcessInstanceByKey("leave",map); -
String processId = pi1.getId(); -
String taskId = pi1.getTasks().get(0).getId(); -
taskService.complete(taskId, map);//完成第一步申请 -
Task task = taskService.createTaskQuery().processInstanceId(processId).singleResult(); -
String taskId2 = task.getId(); -
map.put("pass", false); -
taskService.complete(taskId2, map);//驳回申请 -
System.out.println("method startActivityDemo end...."); -
return false; -
} -
}
5.bpmn
在resources目录下新建文件夹:processes,并在processes创建一个新的bpmn文件,如图

文件内容:
-
<?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" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="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/testm1510735932336" id="m1510735932336" name=""> -
<process id="leave" isExecutable="true" isClosed="false" processType="None"> -
<startEvent id="_2" name="StartEvent"></startEvent> -
<endEvent id="_3" name="EndEvent"></endEvent> -
<userTask id="approve" name="经理审批" activiti:assignee="${approve}"></userTask> -
<exclusiveGateway id="_5" name="ExclusiveGateway"></exclusiveGateway> -
<sequenceFlow id="_6" sourceRef="approve" targetRef="_5"></sequenceFlow> -
<sequenceFlow id="_7" name="通过" sourceRef="_5" targetRef="_3"> -
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression> -
</sequenceFlow> -
<userTask id="application" name="提交申请" activiti:assignee="${apply}"></userTask> -
<sequenceFlow id="_9" sourceRef="_2" targetRef="application"></sequenceFlow> -
<sequenceFlow id="_10" sourceRef="application" targetRef="approve"></sequenceFlow> -
<userTask id="modify" name="修改申请" activiti:assignee="${apply}"></userTask> -
<sequenceFlow id="_12" name="不通过" sourceRef="_5" targetRef="modify"> -
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression> -
</sequenceFlow> -
<sequenceFlow id="_13" sourceRef="modify" targetRef="approve"></sequenceFlow> -
</process> -
<bpmndi:BPMNDiagram id="BPMNDiagram_leave"> -
<bpmndi:BPMNPlane bpmnElement="leave" id="BPMNPlane_leave"> -
<bpmndi:BPMNShape bpmnElement="_2" id="BPMNShape__2"> -
<omgdc:Bounds height="35.0" width="35.0" x="15.0" y="60.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="_3" id="BPMNShape__3"> -
<omgdc:Bounds height="35.0" width="35.0" x="630.0" y="63.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="approve" id="BPMNShape_approve"> -
<omgdc:Bounds height="55.0" width="85.0" x="315.0" y="50.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="_5" id="BPMNShape__5"> -
<omgdc:Bounds height="40.0" width="40.0" x="505.0" y="60.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="application" id="BPMNShape_application"> -
<omgdc:Bounds height="55.0" width="85.0" x="135.0" y="50.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="modify" id="BPMNShape_modify"> -
<omgdc:Bounds height="55.0" width="85.0" x="315.0" y="150.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6"> -
<omgdi:waypoint x="400.0" y="77.0"></omgdi:waypoint> -
<omgdi:waypoint x="505.0" y="80.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="_7" id="BPMNEdge__7"> -
<omgdi:waypoint x="545.0" y="80.0"></omgdi:waypoint> -
<omgdi:waypoint x="630.0" y="80.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9"> -
<omgdi:waypoint x="50.0" y="77.0"></omgdi:waypoint> -
<omgdi:waypoint x="135.0" y="77.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10"> -
<omgdi:waypoint x="220.0" y="77.0"></omgdi:waypoint> -
<omgdi:waypoint x="315.0" y="77.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12"> -
<omgdi:waypoint x="525.0" y="100.0"></omgdi:waypoint> -
<omgdi:waypoint x="525.0" y="177.0"></omgdi:waypoint> -
<omgdi:waypoint x="400.0" y="177.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13"> -
<omgdi:waypoint x="357.0" y="150.0"></omgdi:waypoint> -
<omgdi:waypoint x="357.0" y="105.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
</bpmndi:BPMNPlane> -
</bpmndi:BPMNDiagram> -
</definitions>
需要认知的问题:.项目启动的时候,activiti会自动在mysql中创建activiti相关表,不用像oracle那样需要手动去创建
6.验证
启动项目前,连接数据库,查看需要连接数据库中没有表,启动项目完成后,刷新数据库,activiti已经创建相关表,打开act_re_procdef表,流程数据已经存在,即流程已经部署成功。
用浏览器访问地址:http://127.0.0.1:8081/activity/activityService/startActivityDemo打印了预计的日志,没有报错信息,查看数据库中的act_ru_task表,发现刚才执行形成的数据,项目成功。
PS:只是简单的微服务,没有去写注册服务、网关配置、熔断机制等等,仅用于activiti与springboot的结合
=========================后续==========================
1.在项目单独作为一个引擎,本身不部署流程的时候,如果resources目录没有“processes”目录,启动项目报错--找不到processes目录。需要在配置文件中添加一下内容:
-
spring: -
activiti: -
####校验流程文件,默认校验resources下的processes文件夹里的流程文件 -
check-process-definitions: false
即启动项目,不去校验processes。
原文地址:https://blog.csdn.net/kkkder/article/details/78562349
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)