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

 更新时间:2018年08月09日 10:58:46   作者:kkkder  
这篇文章主要给大家介绍了关于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

<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。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • JavaFX桌面应用未响应问题解决方案

    JavaFX桌面应用未响应问题解决方案

    这篇文章主要介绍了JavaFX桌面应用未响应问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java API文档的使用方法详解

    Java API文档的使用方法详解

    在开发过程中如果遇到疑难问题,除了可以在网络中寻找答案,也可以在Java API帮助文档(简称"JDK文档"”)中查找答案,下面这篇文章主要给大家介绍了关于Java API文档使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java中java.lang.ClassCastException异常原因以及解决方法详解

    Java中java.lang.ClassCastException异常原因以及解决方法详解

    这篇文章主要给大家介绍了关于Java中java.lang.ClassCastException异常原因以及解决方法的相关资料,ClassCastException从字面上看是类型转换错误,通常是进行强制类型转换时候出的错误,需要的朋友可以参考下
    2024-02-02
  • springBoot前后端分离项目中shiro的302跳转问题

    springBoot前后端分离项目中shiro的302跳转问题

    这篇文章主要介绍了springBoot前后端分离项目中shiro的302跳转问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 搭建Spring MVC和Vue3的应用程序的实现

    搭建Spring MVC和Vue3的应用程序的实现

    本文主要介绍了搭建Spring MVC和Vue3的应用程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Java设置JSON字符串参数编码的示例详解

    Java设置JSON字符串参数编码的示例详解

    在Java中创建JSON字符串,我们可以使用多个库,其中最流行的是Jackson、Gson和org.json,,下面给大家分享Java设置JSON字符串参数编码的示例,感兴趣的朋友一起看看吧
    2024-06-06
  • Java服务如何调用系统指令、Bat脚本记录

    Java服务如何调用系统指令、Bat脚本记录

    这篇文章主要介绍了Java服务如何调用系统指令、Bat脚本记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot整合MongoDB完整实例代码

    SpringBoot整合MongoDB完整实例代码

    本文主要介绍了SpringBoot整合MongoDB完整实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java线程之锁对象Lock-同步问题更完美的处理方式代码实例

    Java线程之锁对象Lock-同步问题更完美的处理方式代码实例

    这篇文章主要介绍了Java线程之锁对象Lock-同步问题更完美的处理方式代码实例,还是挺不错的,这里分享给大家,需要的朋友可以参考。
    2017-11-11
  • Java-JFrame-swing嵌套浏览器的具体步骤

    Java-JFrame-swing嵌套浏览器的具体步骤

    下面小编就为大家带来一篇Java-JFrame-swing嵌套浏览器的具体步骤。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论