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 ...
随机推荐
- Django模板之模板继承(extends/block)
Django模版引擎中最强大也是最复杂的部分就是模版继承了.模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 block. 模板继承: 1. ...
- Django视图函数之三种响应模式
视图函数响应处理: from django.shortcuts import render,HttpResponse,redirect (1)render 处理模板文件,可以渲染模板,第一个参数必须为 ...
- oracle start with
select * from t where 1=1 START WITH key_id=600 CONNECT BY PRIOR key_id = pid order by key_id desc
- 【MySQL】详细说下MySQL删除数据的过程是什么样的?
drop table 这里先介绍一下[InnoDB]存储表空间概念: Innodb存储引擎,可将所有的数据库数据存放于[ibdata1]的共享表空间:也可以将每张表存放于独立的.idb文件的独立表空间 ...
- 容器技术之Docker数据卷
前一篇随笔中我们了解了docker的网络相关说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12952616.html:今天我们来聊一聊docker的数据管 ...
- 通过adb调试Unity开发的安卓应用
命令: 1. adb logcat -s Unity 2. adb | grep Unity
- jmeter之cookies管理器的使用
作用: 1 发送请求,经常要校验cookies信息 2 针对有的cookie是用的sessionid来进行校验的,这个就需要自己去配置cookie管理器里面的信息,而且sessionid是有时效性的 ...
- 使用 IdentityService4 集成小程序登录一种尝试
1 场景介绍 主要业务是通过 App 承载,在 App 中可以注册和登录,为了更好的发展业务引入了微信小程序,于是如何让这两个入口的用户互通便成了需要解决的问题. 看了一下其它 App 大致地思路是两 ...
- HTML开发实例-简单相亲网站开发(主体为table)
实现功能:简单的相亲网站: 清楚不常在,抓紧谈恋爱 我承诺 年满十八岁 单身 抱着严肃态度 寻找真诚的另一半 性别: 男 女 生日: --请选择年-- 2019 2020 2021 --请选择月-- ...
- [SD心灵鸡汤]006.每月一则 - 2015.10
1. 贫不足羞,可羞是贫而无志. 2. 艺术的大道上荆棘丛生,这也是好事,常人望而却步,只有意志坚强的人例外. 3. 古今中外,凡成就事业,对人类有作为的无一不是脚踏实地.艰苦攀登的结果. 4. 理想 ...