好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

spring boot activiti工作流的搭建与简单使用

前言

最近一直研究 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

查看更多关于spring boot activiti工作流的搭建与简单使用的详细内容...

  阅读:46次