工作流Activiti学习二 Activiti流程引擎初始化
Activiti流程中的核心是流程引擎,其他服务都是通过ProcessEngine来获取的,获取流程引擎的同时也会初始化Activiti的原始表,下面简单介绍一下创建Activiti流程引擎的几种方式,Activiti的原始表后面再介绍。
一、pom.xml依赖
<!-- 配置版本 --> <properties> <sping.version>4.3.17.RELEASE</sping.version> <mysql.version>5.1.39</mysql.version> <activiti.version>5.22.0</activiti.version> <mybatis.version>3.4.6</mybatis.version> <!-- 只能使用2.0以下的版本 --> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!-- activiti的依赖 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <!-- ssm集成 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> </dependency> <!-- mysql驱动 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- Spring相关依赖 --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${sping.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${sping.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${sping.version}</version> </dependency> <!-- mybatis依赖 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> <build> <plugins> <!-- 配置编译的jdk版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <!-- 指定source和target的版本 --> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
二、配置数据源DataSource方式初始化Activiti原始表
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngines; import org.junit.Test; import org.springframework.jdbc.datasource.DriverManagerDataSource; /** * * @ClassName: InitTable * @Description: 初始化activiti表 * @date 2020年6月25日 * */ public class InitTable { /** * 初始化方式一 * 配置数据源方式 */ @Test public void intiTables_1() { // 创建数据源 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/activiti"); dataSource.setUsername("root"); dataSource.setPassword("123456"); // 创建流程引擎的配置 ProcessEngineConfiguration configuration = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration(); configuration.setDataSource(dataSource); // 配置初始化的方式 // DB_SCHEMA_UPDATE_FALSE:如果数据库里面没有activiti相关表,不会创建 // DB_SCHEMA_UPDATE_TRUE:如果数据库里面没有activiti相关表,创建 // DB_SCHEMA_UPDATE_CREATE_DROP:创建表,使用完成后删除 // configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // drop-create:如果数据库里面有表,先删除再新建 configuration.setDatabaseSchemaUpdate("drop-create"); // 获得流程引擎 ProcessEngine processEngine = configuration.buildProcessEngine(); System.out.println(processEngine); } }
属性databaseSchemaUpdate的默认值是false。
/** Checks the version of the DB schema against the library when * the process engine is being created and throws an exception * if the versions don't match. */ public static final String DB_SCHEMA_UPDATE_FALSE = "false"; /** Upon building of the process engine, a check is performed and * an update of the schema is performed if it is necessary. */ public static final String DB_SCHEMA_UPDATE_TRUE = "true";
protected String databaseSchemaUpdate = DB_SCHEMA_UPDATE_FALSE;
databaseSchemaUpdate=‘true’: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。
databaseSchemaUpdate=‘false’: activiti会对数据库中表进行检测。如果表不存在,则抛出异常。默认值是false。
二、读取配置文件的方式
1、创建配置文件activiti.cfg.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 流程引擎配置--> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- 数据库相关信息 --> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="123456" /> <!-- 允许执行数据库更新 --> <property name="databaseSchemaUpdate" value="true" /> </bean> </beans>
2、读取配置文件的方式初始化Activiti相关表
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngines; import org.junit.Test; import org.springframework.jdbc.datasource.DriverManagerDataSource; /** * * @ClassName: InitTable * @Description: 初始化activiti表 * @author xzp * @date 2020年6月25日 * */ public class InitTable { /** * 初始化方式二 * xml方式 */ @Test public void intiTables_2() { // 读取资源文件获取流程引擎配置对象 ProcessEngineConfiguration configuration = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml"); // 获取流程引擎 ProcessEngine processEngine = configuration.buildProcessEngine(); System.out.println(processEngine); } }
三、获取默认的流程引擎
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngines; import org.junit.Test; import org.springframework.jdbc.datasource.DriverManagerDataSource; /** * * @ClassName: InitTable * @Description: 初始化activiti表 * @author * @date 2020年6月25日 * */ public class InitTable { @Test public void intiTables_3() { /** * 以这种方式创建,必须创建activiti.cfg.xml配置文件,配置文件中配置数据库、初始化方式 */ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println(processEngine); } }
我们来看下getDefaultProcessEngine做了哪些事情:
1、根据名称获流程引擎,这里是获取默认的流程引擎。判断流程引擎是否已经被初始化,如果没有被初始化,先做初始化,再从processEngines容器中获取Bean。这里ProcesssEngines是一个Map容器。
2、初始化过程
初始化大致过程:读取xml文件转化为可读资源信息,判断流程引擎信息容器中是否存在配置文件中的引擎bean信息,如果存在则移除流程引擎信息容器中bean信息,通过可读资源信息初始化流程引擎实例,并放入容器中。其实第三种方式---获取默认流程引擎是对第二种方式的封装。
/* 初始化xml文件中的所有流程引擎*/ public synchronized static void init() { if (!isInitialized()) { if(processEngines == null) { // 如果当前processEngine容器为null,创建容器用来存储流程引擎的bean processEngines = new HashMap<String, ProcessEngine>(); } // 获取类加载器 ClassLoader classLoader = ReflectUtil.getClassLoader(); Enumeration<URL> resources = null; try { // 读取xml文件资源,获取默认的流程引擎,配置文件名称必须为activiti.cfg.xml resources = classLoader.getResources("activiti.cfg.xml"); } catch (IOException e) { throw new ActivitiIllegalArgumentException("problem retrieving activiti.cfg.xml resources on the classpath: "+System.getProperty("java.class.path"), e); } // Set集合去重操作 Set<URL> configUrls = new HashSet<URL>(); while (resources.hasMoreElements()) { configUrls.add( resources.nextElement() ); } for (Iterator<URL> iterator = configUrls.iterator(); iterator.hasNext();) { URL resource = iterator.next(); log.info("Initializing process engine using configuration '{}'", resource.toString()); // 初始化流程引擎 initProcessEnginFromResource(resource); } // 通过Spring的配置初始化Activiti的流程引擎,我这个demo里并未配置 try { resources = classLoader.getResources("activiti-context.xml"); } catch (IOException e) { throw new ActivitiIllegalArgumentException("problem retrieving activiti-context.xml resources on the classpath: "+System.getProperty("java.class.path"), e); } while (resources.hasMoreElements()) { URL resource = resources.nextElement(); log.info("Initializing process engine using Spring configuration '{}'", resource.toString()); initProcessEngineFromSpringResource(resource); } setInitialized(true); } else { log.info("Process engines already initialized"); } }
initProcessEnginFromResource(resource);方法如下
private static ProcessEngineInfo initProcessEnginFromResource(URL resourceUrl) { // 获取文件中的流程引擎信息 ProcessEngineInfo processEngineInfo = processEngineInfosByResourceUrl.get(resourceUrl.toString()); // 如果流程引擎信息在容器中已经存在,则移除容器中的流程引擎信息 if (processEngineInfo!=null) { processEngineInfos.remove(processEngineInfo); if (processEngineInfo.getException()==null) { String processEngineName = processEngineInfo.getName(); processEngines.remove(processEngineName); processEngineInfosByName.remove(processEngineName); } processEngineInfosByResourceUrl.remove(processEngineInfo.getResourceUrl()); } String resourceUrlString = resourceUrl.toString(); try { log.info("initializing process engine for resource {}", resourceUrl); // 通过xml文件资源初始化流程引擎 ProcessEngine processEngine = buildProcessEngine(resourceUrl); String processEngineName = processEngine.getName(); log.info("initialised process engine {}", processEngineName); processEngineInfo = new ProcessEngineInfoImpl(processEngineName, resourceUrlString, null); // 将流程引擎实例放入流程引擎容器中 processEngines.put(processEngineName, processEngine); processEngineInfosByName.put(processEngineName, processEngineInfo); } catch (Throwable e) { log.error("Exception while initializing process engine: {}", e.getMessage(), e); processEngineInfo = new ProcessEngineInfoImpl(null, resourceUrlString, getExceptionString(e)); } processEngineInfosByResourceUrl.put(resourceUrlString, processEngineInfo); // 将流程引擎信息实例放入流程引擎信息容器中 processEngineInfos.add(processEngineInfo); return processEngineInfo; }
就罗列以上几种流程引擎初始化的方式,简单记录下,方便以后复习。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)