前言
最近一直研究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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<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,可根据自己项目使用)
1
2
3
4
5
6
7
8
9
10
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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文件,如图
文件内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<?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目录。需要在配置文件中添加一下内容:
1
2
3
4
|
spring:
activiti:
####校验流程文件,默认校验resources下的processes文件夹里的流程文件
check-process-definitions: false
|
即启动项目,不去校验processes。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://blog.csdn.net/kkkder/article/details/78562349