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 ...
随机推荐
- binlog在并发状态下的记录
前两天看binlog发现个奇怪的地方:对于position靠后的记录,timestamp却比之前的记录还要小.当时觉得大概和并发有关系 后来做了个实验 开两个session 对于session1: b ...
- 系统对 Device Tree Overlays 的支持方式
问题来源: 野火 iMX 6ULL 开发板资料. https://tutorial.linux.doc.embedfire.com/zh_CN/latest/linux_basis/fire-conf ...
- Kubernetes学习笔记(四):服务
服务介绍 服务是一种为一组相同功能的pod提供单一不变接入点的资源.当服务存在时,他的IP和端口不会改变.客户端通过IP和端口建立连接,这些连接会被路由到任何一个pod上.如此,客户端不需要知道每个单 ...
- vue项目中关闭eslint的方法
非常简单的操作方法!不用再去为了烦人的代码标准报错而苦恼了! 方法一:在项目根目录下增加 vue.config.js 文件 添加以下代码: module.exports = { lintOnSave: ...
- JS中的基本包装类型
想一下:为什么String类型的值可以调用某些方法和访问某些属性呢? 在基本数据类型中有3个特殊的存在:String Number Boolean 这三个基本类型都有自己对应的包装对象.包装对象,其实 ...
- js数组对象的一些常用方法
pop:删除数组最后一个元素 语法: array.pop(); 如 var array = ['1','2','3']; array.pop(); 返回结果:[‘1’,‘2’]此方法会改变数组的长度 ...
- Xmind写测试点
引入: 既然我们这篇要说<Xmind写测试点>,那么先来回顾一下,什么情况下才写测试点,而不写测试用例. 之前写过一篇<测试用例-20问20答>,没看过的朋友戳这里:,其中就有 ...
- [PHP学习教程 - 系统]004.通过ini_set()来设置系统属性(ini_set Method)
PHP原意:ini_set — 为一个系统配置项设置值 基本信息: string ini_set ( string $varname , string $newvalue). (说明:设置指定配置选项 ...
- [SD心灵鸡汤]003.每月一则 - 2015.07
乔布斯去世了,但他留给世人的财富却很多,值得每个人学习.他是个精力充沛魅力无限的家伙,同时也是一个很会鼓动人心的激励大师,甚至在他的平常对话中,经典的语句也常常脱口而出. 这里摘取了一些他的经典语录, ...
- 这个Maven依赖的问题,你敢说你没遇到过
Maven 依赖没处理好的话经常会导致发生一些问题,非常烦.今天给大家分享一个依赖相关的问题,说不定你之前就遇到过. 问题背景 有个 ES 搜索的项目,刚开始还是好好的状态,过了一段时间,然后就发现启 ...