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 ...
随机推荐
- easyui API
http://www.jeasyuicn.com/api/docTtml/index.htm
- for、forEach、for in、for of用法
循环遍历数组或者对象,for.forEach.for in . for of 使用最多 for循环 自Javascript诞生时就有,遍历数组,for 循环的语法如下: for (语句 1; 语句 2 ...
- Gym101630A Archery Tournament
题目链接:https://vjudge.net/problem/Gym-101630A 题目大意: 有\(n\)个操作,每次输入\(t\) \(x\) \(y\)\((t=1,2; -10^9 \le ...
- 【MySQL】索引的本质(B+Tree)解析
索引是帮助MySQL高效获取数据的排好序的数据结构. 索引数据结构 二叉树 红黑树 Hash表 B-Tree MySQL所使用为B+Tree (B-Tree变种) 非叶子节点不存储data,只存储索引 ...
- WordPress 伪静态规则(IIS/Apache/Nginx)
不少朋友总是询问 WordPress 如何添加伪静态规则,今天倡萌就总结一下 Apache/Nginx 三种环境下的伪静态规则,希望对大家有所帮助. 检测主机是否支持伪静态的方法:在WP后台 > ...
- linux添加策略路由python脚本(待完善)
#! _*_ coding:utf-8 _*_ import os,sys,re,fileinput,socket device_list = [] ip_list = [] ip_end = [] ...
- 【java】关键字volatile
volatile 1. 含义: volatile是JVM提供的轻量级的同步机制,具有三个特点:保证可见性.不保证原子性.禁止指令重排. 1.1 保证可见性 一个线程修改了共享变量并写回主内存,其他线程 ...
- [Python进阶]001.不定参数
不定参数 介绍 元组参数 字典参数 混合 介绍 不定参数用 * 和 ** 定义 不定参数必须在其他所有参数之后 例子:os.path.join 方法就可以写入不定数量的参数 元组参数 定义:*args ...
- pandas DataFrame 的横向纵向拼接组合
concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ...
- C/C++多参数函数参数的计算顺序与压栈顺序
一.前言 今天在看Thinking in C++这本书时,书中的一个例子引起了我的注意,具体是使用了下面这句 单看这条语句的语义会发现仅仅是使用一个简单的string的substr函数将所得子串pus ...