Activiti6 学习日志(一):整合 SpringBoot2.1.3
本章节记录整合过程和部分问题,目前整合并不完美后续会继续更新...
技术栈: springboot 2.1.3 activiti6 tk.mybatis 本文仅记录activiti相关部分
1. pom.xml
<properties>
<mybatis-spring-boot>1.3.2</mybatis-spring-boot>
<springboot>2.1.3.RELEASE</springboot>
<tkmybatis>2.1.5</tkmybatis>
<activiti.version>6.0.0</activiti.version>
</properties>
<dependencies>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot}</version>
</dependency>
<!-- Spring Boot TK.Mybtis-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${tkmybatis}</version>
<!-- activiti默认使用JPA, tk的实现会出现问题,具体原因自行了解 -->
<exclusions>
<exclusion>
<artifactId>persistence-api</artifactId>
<groupId>javax.persistence</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-jpa</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependencies>
2. application.yml
spring:
activiti:
# true会校验部署流程的 .bpmn 文件,一般activiti支持两种扩展名的部署: .bpmn .bpmn20.xml
# 可以选择springboot自动配置 processEngine, 我没有选择这种方式
check-process-definitions: false
3. java configuration
import org.activiti.engine.*;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
public class ActivitiConfig {
@Bean
@Primary
public SpringProcessEngineConfiguration springProcessEngineConfiguration(DataSource dataSource,
DataSourceTransactionManager transactionManager) throws IOException {
// 自动部署流程的读取位置
Resource[] resources = new PathMatchingResourcePatternResolver()
.getResources(ResourceLoader.CLASSPATH_URL_PREFIX + "processes/*.bpmn");
SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();
// 配置自己的数据源和事务管理器
config.setDataSource(dataSource);
config.setTransactionManager(transactionManager);
// jdbc最大等待时间20秒,超出后重新连接
config.setJdbcMaxWaitTime(2000);
/**
* 数据库更新模式:
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE 如果数据库里面没有activit的表,也不会创建
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP 创建表,使用完之后删除
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE 如果数据库里面没有表,就创建
* "dorp-create" 如果数据库里面有表,那么先删除再创建
* nullCatalogMeansCurrent=true 数据库连接后面记得加这个,否则自动建表可能会失败
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE);
config.setDeploymentResources(resources);
// 检测身份信息表
config.setDbIdentityUsed(false);
// 防止图片乱码
config.setActivityFontName("宋体");
config.setAnnotationFontName("宋体");
config.setLabelFontName("宋体");
return config;
}
@Bean
@Primary
public ProcessEngineFactoryBean processEngineFactoryBean(
SpringProcessEngineConfiguration springProcessEngineConfiguration) throws ClassNotFoundException {
ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration);
return processEngineFactoryBean;
}
/** 我在创建引擎的时候一直报错:JpaProcessEngineAutoConfiguration 重复定义了相同名字的bean让我开启spring重写, 我就把自启动排除掉了。 */
@Bean("processEngine")
@Primary
public ProcessEngine processEngine(ProcessEngineFactoryBean processEngineFactoryBean) throws Exception {
return processEngineFactoryBean.getObject();
}
@Bean
@Primary
public RepositoryService repositoryService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getRepositoryService();
}
@Bean
@Primary
public RuntimeService runtimeService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getRuntimeService();
}
@Bean
@Primary
public TaskService taskService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getTaskService();
}
@Bean
@Primary
public HistoryService historyService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getHistoryService();
}
@Bean
@Primary
public ManagementService managementService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getManagementService();
}
@Bean
@Primary
public IdentityService identityService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getIdentityService();
}
@Bean
@Primary
public FormService formService(@Qualifier("processEngine") ProcessEngine processEngine) {
return processEngine.getFormService();
}
}
4. applicationBoot.java
import org.activiti.spring.boot.JpaProcessEngineAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/** org.activiti.spring.boot.SecurityAutoConfiguration.class activiti6中的配置是有问题的,后续修改一下源码解决一下。先排除掉
* org.activiti.spring.boot.JpaProcessEngineAutoConfiguration 这个东西就好烦人,自动使用JPA,而且会重写自定义的processEngine,所以排除掉它。其实可能只有我这有问题,有大神好心帮我解个惑嘛...
*/
@SpringBootApplication(exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class,
JpaProcessEngineAutoConfiguration.class})
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置到这基本就结束了,下面可以简单测试一下是否成功
import com.zwzgame.mwerp.model.floworder.MwClaimProjectOrder;
import org.activiti.engine.*;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ActivitiTest {
private ProcessEngine processEngine = null;
@Before
public void executeBefor() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://192.168.*.*:3306/mwerp?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=true&nullCatalogMeansCurrent=true");
dataSource.setUsername("root");
dataSource.setPassword("111111");
processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()
.setDataSource(dataSource)
.setJdbcMaxWaitTime(2000)
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.buildProcessEngine();
}
@Test
public void activitiTest() {
RepositoryService rs = processEngine.getRepositoryService();
List<ProcessDefinition> list = rs.createProcessDefinitionQuery().list();
list.stream().forEach(System.out::println);
}
@Test
public void startFlowTest() {
RuntimeService runtimeService = processEngine.getRuntimeService();
String k = MwClaimProjectOrder.class.getSimpleName();
Map<String, Object> var = new HashMap<>();
var.put("username", "testpm");
ProcessInstance pi = runtimeService.startProcessInstanceByKey(k, k + ":123", var);
System.out.println("businessKey:" + pi.getBusinessKey());
System.out.println("piId:" + pi.getId());
System.out.println("pdName:" + pi.getProcessDefinitionName());
}
@Test
public void listTaskTest() {
String u = "testpm";
List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee(u).list();
for (Task t : list) {
System.out.println(t.getId());
System.out.println(t.getAssignee());
System.out.println(t.getName());
System.out.println(t.getOwner());
System.out.println(t.getTaskDefinitionKey());
}
}
@Test
public void nextFlowTest() {
TaskService taskService = processEngine.getTaskService();
Map<String, Object> var = new HashMap<>();
var.put("approved", "agreed");
taskService.complete("15006", var);
System.out.println("执行成功");
}
@Test
public void deleteFlowTest() {
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.deleteDeployment("7501");
System.out.println("删除成功");
}
}
Activiti6 学习日志(一):整合 SpringBoot2.1.3的更多相关文章
- 学习SpringBoot,整合全网各种优秀资源,SpringBoot基础,中间件,优质项目,博客资源等,仅供个人学习SpringBoot使用
学习SpringBoot,整合全网各种优秀资源,SpringBoot基础,中间件,优质项目,博客资源等,仅供个人学习SpringBoot使用 一.SpringBoot系列教程 二.SpringBoot ...
- 我的游戏学习日志3——三国志GBA
我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...
- GRE学习日志
发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...
- Cortex-M3学习日志(六) -- ADC实验
上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...
- Cortex-M3学习日志(五) -- DAC实验
终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...
- webpack2学习日志
webpack说容易也容易,说难也难,主要还是看个人,想学到什么样的程度,很多公司可能要求仅仅是会用就行,但是也有一些公司要求比较高,要懂一些底层的原理,所以还是要花一些时间的,看个人需求.这篇仅仅是 ...
- javascript学习日志:前言
javascript学习日志系列的所有博客,主要理论依据是<javascript权威指南>(犀牛书第6版)以及<javascript高级程序设计第三版>(红色书),目前js行业 ...
- MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志
今天继续Smobiler开发APP的学习日志,这次是做一个title.toolbar.侧边栏三种效果 样式一 一. Toolbar 1. 目标样式 我们要实现上图中的效果 ...
- springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n ---internationalization 不就是i和n之间有18个字母... http://logging.a ...
随机推荐
- MyCat垂直分库
一.什么是垂直分库 将一类功能的表从一个实例切分到另一个实例,横向扩展实例,增加写负载 目标:将1个实例的4类表拆分多4个实例中 二.垂直切分步骤 2.1收集分析业务模块间的关系,能分几个库 2.2全 ...
- Hyperledger fabric MSP成员管理
Hyperledger fabric 1.0 基于 PKI(Public Key Infrastructure)体系,引入了MSP模块(Membership Service Provider): 成员 ...
- sobel( ) 算子
只是简单的使用方面的记录 sobel()算子是图像处理中用于边缘检测的 opencv-python 中的函数形式为 def Sobel(src, ddepth, dx, dy, dst=None, k ...
- zookeeper安装部署步骤
安装步骤 本安装教程,采用zookeeper 3.6.1 装java 下载zk包,分发到各个机器 确定或创建一个zookeeper的数据存放路径,并在该路径下创建一个myid文件,其中设置当前zook ...
- 1.Redis介绍和使用场景
(1)持久化数据库的缺点 平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常 ...
- 3.Linux如何管理分区
上一次谈完了硬盘与分区的基础知识,下面谈一下Linux如何管理分区. Linux管理硬件和windows完全不同.任何东西(包括硬件)在Linux看来都是文件设备,有字符和二进制形式的设备.如打印机. ...
- [设计模式](转)Java中的24种设计模式与7大原则
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 读Pyqt4简介,带你入门Pyqt4 _001
PyQt是用来创建GUI应用程序的工具包,它把Python和成功的Qt绑定在一起,Qt库是这个星球上最强大的库之一,如果不是最强大的话. PyQt作为一组Python模块的实现.有超过300个类和超过 ...
- JavaScript ——内部函数和匿名函数
在JS中,函数是一种数据类型,可以将它赋值给变量,因此函数可以这样创建: var func=function(){ alert("func"); } func(); 既然函数是一种 ...
- java方式实现希尔排序
一.希尔排序简述和基本思想 希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本.但是希尔排序是非稳定排序的算法.希尔排序比一般插入排序有以下几点改进: 一般插入排序每次只能将数据移动一位, ...