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

  2. <modelVersion>4.0.0</modelVersion>

  3. <groupId>com.xxx</groupId>

  4. <artifactId>xxx</artifactId>

  5. <version>0.0.1-SNAPSHOT</version>

  6. <properties>

  7. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  8. <java.version>1.8</java.version>

  9. </properties>

  10. <parent>

  11. <groupId>org.springframework.boot</groupId>

  12. <artifactId>spring-boot-starter-parent</artifactId>

  13. <version>1.5.8.RELEASE</version>

  14. </parent>

  15. <dependencies>

  16. <dependency>

  17. <groupId>org.springframework.boot</groupId>

  18. <artifactId>spring-boot-starter-web</artifactId>

  19. </dependency>

  20. <dependency>

  21. <groupId>org.activiti</groupId>

  22. <artifactId>activiti-spring-boot-starter-basic</artifactId>

  23. <version>6.0.0</version>

  24. </dependency>

  25. <dependency>

  26. <groupId>org.springframework.boot</groupId>

  27. <artifactId>spring-boot-starter-data-jpa</artifactId>

  28. </dependency>

  29. <dependency>

  30. <groupId>org.springframework.boot</groupId>

  31. <artifactId>spring-boot-starter-thymeleaf</artifactId>

  32. </dependency>

  33. <dependency>

  34. <groupId>org.springframework.boot</groupId>

  35. <artifactId>spring-boot-starter-web</artifactId>

  36. </dependency>

  37. <dependency>

  38. <groupId>mysql</groupId>

  39. <artifactId>mysql-connector-java</artifactId>

  40. <scope>runtime</scope>

  41. </dependency>

  42. <dependency>

  43. <groupId>org.springframework.boot</groupId>

  44. <artifactId>spring-boot-starter-tomcat</artifactId>

  45. </dependency>

  46. <dependency>

  47. <groupId>org.springframework.boot</groupId>

  48. <artifactId>spring-boot-starter-test</artifactId>

  49. <scope>test</scope>

  50. </dependency>

  51. </dependencies>

  52. <build>

  53. <plugins>

  54. <plugin>

  55. <groupId>org.springframework.boot</groupId>

  56. <artifactId>spring-boot-maven-plugin</artifactId>

  57. </plugin>

  58. </plugins>

  59. </build>

  60. </project>

确认服务是可用

2.连接服务名、服务端口、数据库配置

在resources目录下的application.properties(项目定位原因没有使用yaml,可根据自己项目使用)


  1. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activity?characterEncoding=utf8&useSSL=true

  3. spring.datasource.username=root

  4. spring.datasource.password=root

  5. spring.jpa.properties.hibernate.hbm2ddl.auto=update

  6. spring.jpa.show-sql=true

  7. server.port=8081

  8. server.context-path=/activity

  9. server.session.timeout=10

  10. server.tomcat.uri-encoding=UTF-8

确认配置的数据库可用

3.main


  1. import org.springframework.boot.SpringApplication;

  2. import org.springframework.boot.autoconfigure.SpringBootApplication;

  3. /**

  4. * Created by Guo on 2017/11/15.

  5. */

  6. @SpringBootApplication

  7. public class ActivityApp

  8. {

  9. public static void main(String[] args)

  10. {

  11. SpringApplication.run(ActivityApp.class, args);

  12. }

  13. }

4.service及实现

service:


  1. import org.activiti.engine.task.TaskQuery;

  2. import org.springframework.web.bind.annotation.RequestMapping;

  3. import org.springframework.web.bind.annotation.RequestMethod;

  4. import org.springframework.web.bind.annotation.RestController;

  5. @RestController

  6. @RequestMapping("/activityService")

  7. public interface ActivityConsumerService {

  8. /**

  9. * 流程demo

  10. * @return

  11. */

  12. @RequestMapping(value="/startActivityDemo",method=RequestMethod.GET)

  13. public boolean startActivityDemo();

  14. }

impl


  1. import java.util.HashMap;

  2. import java.util.Map;

  3. import org.activiti.engine.RuntimeService;

  4. import org.activiti.engine.TaskService;

  5. import org.activiti.engine.impl.persistence.entity.ExecutionEntity;

  6. import org.activiti.engine.task.Task;

  7. import org.activiti.engine.task.TaskQuery;

  8. import org.apache.commons.lang3.StringUtils;

  9. import org.springframework.beans.factory.annotation.Autowired;

  10. import org.springframework.stereotype.Service;

  11. import com.hongguaninfo.activity.service.ActivityConsumerService;

  12. @Service("activityService")

  13. public class ActivityConsumerServiceImpl implements ActivityConsumerService {

  14. @Autowired

  15. private RuntimeService runtimeService;

  16. @Autowired

  17. private TaskService taskService;

  18. @Override

  19. public boolean startActivityDemo() {

  20. System.out.println("method startActivityDemo begin....");

  21. Map<String,Object> map = new HashMap<String,Object>();

  22. map.put("apply","zhangsan");

  23. map.put("approve","lisi");

  24. //流程启动

  25. ExecutionEntity pi1 = (ExecutionEntity) runtimeService.startProcessInstanceByKey("leave",map);

  26. String processId = pi1.getId();

  27. String taskId = pi1.getTasks().get(0).getId();

  28. taskService.complete(taskId, map);//完成第一步申请

  29. Task task = taskService.createTaskQuery().processInstanceId(processId).singleResult();

  30. String taskId2 = task.getId();

  31. map.put("pass", false);

  32. taskService.complete(taskId2, map);//驳回申请

  33. System.out.println("method startActivityDemo end....");

  34. return false;

  35. }

  36. }

5.bpmn

在resources目录下新建文件夹:processes,并在processes创建一个新的bpmn文件,如图

文件内容:


  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <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="">

  3. <process id="leave" isExecutable="true" isClosed="false" processType="None">

  4. <startEvent id="_2" name="StartEvent"></startEvent>

  5. <endEvent id="_3" name="EndEvent"></endEvent>

  6. <userTask id="approve" name="经理审批" activiti:assignee="${approve}"></userTask>

  7. <exclusiveGateway id="_5" name="ExclusiveGateway"></exclusiveGateway>

  8. <sequenceFlow id="_6" sourceRef="approve" targetRef="_5"></sequenceFlow>

  9. <sequenceFlow id="_7" name="通过" sourceRef="_5" targetRef="_3">

  10. <conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass}]]></conditionExpression>

  11. </sequenceFlow>

  12. <userTask id="application" name="提交申请" activiti:assignee="${apply}"></userTask>

  13. <sequenceFlow id="_9" sourceRef="_2" targetRef="application"></sequenceFlow>

  14. <sequenceFlow id="_10" sourceRef="application" targetRef="approve"></sequenceFlow>

  15. <userTask id="modify" name="修改申请" activiti:assignee="${apply}"></userTask>

  16. <sequenceFlow id="_12" name="不通过" sourceRef="_5" targetRef="modify">

  17. <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass}]]></conditionExpression>

  18. </sequenceFlow>

  19. <sequenceFlow id="_13" sourceRef="modify" targetRef="approve"></sequenceFlow>

  20. </process>

  21. <bpmndi:BPMNDiagram id="BPMNDiagram_leave">

  22. <bpmndi:BPMNPlane bpmnElement="leave" id="BPMNPlane_leave">

  23. <bpmndi:BPMNShape bpmnElement="_2" id="BPMNShape__2">

  24. <omgdc:Bounds height="35.0" width="35.0" x="15.0" y="60.0"></omgdc:Bounds>

  25. </bpmndi:BPMNShape>

  26. <bpmndi:BPMNShape bpmnElement="_3" id="BPMNShape__3">

  27. <omgdc:Bounds height="35.0" width="35.0" x="630.0" y="63.0"></omgdc:Bounds>

  28. </bpmndi:BPMNShape>

  29. <bpmndi:BPMNShape bpmnElement="approve" id="BPMNShape_approve">

  30. <omgdc:Bounds height="55.0" width="85.0" x="315.0" y="50.0"></omgdc:Bounds>

  31. </bpmndi:BPMNShape>

  32. <bpmndi:BPMNShape bpmnElement="_5" id="BPMNShape__5">

  33. <omgdc:Bounds height="40.0" width="40.0" x="505.0" y="60.0"></omgdc:Bounds>

  34. </bpmndi:BPMNShape>

  35. <bpmndi:BPMNShape bpmnElement="application" id="BPMNShape_application">

  36. <omgdc:Bounds height="55.0" width="85.0" x="135.0" y="50.0"></omgdc:Bounds>

  37. </bpmndi:BPMNShape>

  38. <bpmndi:BPMNShape bpmnElement="modify" id="BPMNShape_modify">

  39. <omgdc:Bounds height="55.0" width="85.0" x="315.0" y="150.0"></omgdc:Bounds>

  40. </bpmndi:BPMNShape>

  41. <bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6">

  42. <omgdi:waypoint x="400.0" y="77.0"></omgdi:waypoint>

  43. <omgdi:waypoint x="505.0" y="80.0"></omgdi:waypoint>

  44. </bpmndi:BPMNEdge>

  45. <bpmndi:BPMNEdge bpmnElement="_7" id="BPMNEdge__7">

  46. <omgdi:waypoint x="545.0" y="80.0"></omgdi:waypoint>

  47. <omgdi:waypoint x="630.0" y="80.0"></omgdi:waypoint>

  48. </bpmndi:BPMNEdge>

  49. <bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9">

  50. <omgdi:waypoint x="50.0" y="77.0"></omgdi:waypoint>

  51. <omgdi:waypoint x="135.0" y="77.0"></omgdi:waypoint>

  52. </bpmndi:BPMNEdge>

  53. <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10">

  54. <omgdi:waypoint x="220.0" y="77.0"></omgdi:waypoint>

  55. <omgdi:waypoint x="315.0" y="77.0"></omgdi:waypoint>

  56. </bpmndi:BPMNEdge>

  57. <bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12">

  58. <omgdi:waypoint x="525.0" y="100.0"></omgdi:waypoint>

  59. <omgdi:waypoint x="525.0" y="177.0"></omgdi:waypoint>

  60. <omgdi:waypoint x="400.0" y="177.0"></omgdi:waypoint>

  61. </bpmndi:BPMNEdge>

  62. <bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13">

  63. <omgdi:waypoint x="357.0" y="150.0"></omgdi:waypoint>

  64. <omgdi:waypoint x="357.0" y="105.0"></omgdi:waypoint>

  65. </bpmndi:BPMNEdge>

  66. </bpmndi:BPMNPlane>

  67. </bpmndi:BPMNDiagram>

  68. </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. spring:

  2. activiti:

  3. ####校验流程文件,默认校验resources下的processes文件夹里的流程文件

  4. check-process-definitions: false

即启动项目,不去校验processes。

原文地址:https://blog.csdn.net/kkkder/article/details/78562349

springboot activiti工作流简单示例相关推荐

  1. 简单的springboot+activiti工作流搭建与实现

    工作流 一.什么是工作流 1.工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系 ...

  2. springboot+activiti工作流mybatis冲突解决办法

    `<?xml version="1.0" encoding="UTF-8"?> ACTIVITI com.test 6.5.0 4.0.0 < ...

  3. Springboot整合Dubbo简单示例

    Springboot 整合dubbo: 1 简介 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的 ...

  4. Activiti工作流使用之SpringBoot整合Activiti

    Activiti工作流使用之SpringBoot整合Activiti 文章目录 Activiti工作流使用之SpringBoot整合Activiti 一.springboot整合Activiti环境依 ...

  5. # SpringBoot 整合 Activiti 工作流框架

    SpringBoot 整合 Activiti 工作流框架 Activiti 介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调 ...

  6. react ant design pro typescript springboot activiti权限、工作流框架

    是什么? 使用springboot,activiti,mybatis,react,ant design pro,typescript 开发的后台管理系统(包含权限管理.工作流等功能),真正前后端分离的 ...

  7. SpringBoot集成activiti工作流

    SpringBoot集成activiti工作流(模拟请假流程) 链接:https://pan.baidu.com/s/10BT_Zertm1WBBrlrdE-QWQ  提取码:zsq6 学习视频地址见 ...

  8. Activiti工作流之实现一个简单的流程审批

    该代码在上一篇博客的基础上开发. Activiti工作流入门 1.绘制bpmn流程图 在resources目录下新建一个diagram文件夹来存放我们绘制的bpmn流程图 由于我的IDEA中已经安装了 ...

  9. 【Activiti】 Activiti工作流引擎 - 提交审批和审批处理示例详解 【精品】

    在上一篇的文章中,我给大家分享了Activiti工作流引擎的API的封装代码,通过我们自己封装的代码,在实际的项目中我们就可以进行工作流相关的开发了.以下内容我们分三个部分:提交审批,审批列表查询,审 ...

最新文章

  1. Expression Blend学习动画基础
  2. python调用dll时路径问题_IDEA 使用 JNA 时,DLL 文件路径问题
  3. 云栖TechDay精华文章合集
  4. python3 asyncio loop 使用线程池原理
  5. SpringMVC之文件上传和文件下载
  6. PHP中this,self,parent的区别
  7. arcgis xml 下载 切片_GIS开发:Arcgis的切片格式
  8. java包 类 方法_Java中包与包之间方法的调用及其关键字区分(基础)
  9. 金乡高考成绩查询2021,金乡一中举行2021届高三年级一模成绩分析暨表彰大会!现场颁奖...
  10. Android学习之Image操作及时间日期选择器
  11. js进阶 11-15 jquery过滤方法有哪些
  12. 桌面窗口管理器[百度百科]
  13. python3.5手册下载_python3.5.2官方帮助文档 参考手册(CHM版)
  14. CAD绘图软件使用技巧总结及CAD快捷键大全
  15. POJ 3537 Crosses and Crosses 博弈论 SG函数 记忆化搜索
  16. 流程图绘制工具 yEd
  17. java读取文件夹下所有文件并替换文件每一行中指定的字符串
  18. Autofill安装使用
  19. 航空枢纽问题 matlab,[原创]航空领域常用几个速度的定义和说明
  20. 电脑如何远程连接到服务器?Windows、Linux、Unix系统远程连接服务器演示

热门文章

  1. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
  2. [leetcode] 740.删除并获得点数
  3. Kubernetes——基本概念与理论
  4. matlab如何使音频文件声音变大_如何制作视频课程
  5. c语言判断一个已知的二叉树是否是二叉排序树_10584 二叉树怎样序列化才能重建...
  6. OSI模型 TCP/IP模型 数据包结构
  7. 纯C写Windows程序系列---------VS2010设置纯C环境 .
  8. java读取gradle属性,Spring Boot获取Gradle中包的属性
  9. java 原理图_Java中比较重要的原理图(三大框架、、、、)
  10. idea改成c盘_解决IDEA占用C盘空间过大的问题