Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >activiti学习笔记(四) 配置器

activiti学习笔记(四) 配置器

作者头像
cfs
发布于 2018-03-08 07:43:40
发布于 2018-03-08 07:43:40
81800
代码可运行
举报
文章被收录于专栏:编码小白编码小白
运行总次数:0
代码可运行

activiti配置器

activiti配置器的作用

       一般在构建流程实例的时候, 会进行初始化,配置器就是可以在获取了流程配置实例,以及初始化之后可以进行一些额外的配置

activiti配置器的机制

allConfigurators集合添加

       在ProcessEngineConfigurationImpl这个类中调用init方法中initConfigurators方法,将所有流程配置器添加到allConfigurators这个集合,流程配置器有两种获取形式,第一种是直接通过bean方式注入到configurators遍历添加到allConfigurators集合,第二种是通过调用spi模式,加载到allConfigurators集合。最后将所有的按照照priority的大小进行排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void initConfigurators() {


    //一个list集合,存放所有ProcessEngineConfigurator
    allConfigurators = new ArrayList<ProcessEngineConfigurator>();

    //遍历Configurators将其添加到allConfigurators这个集合
    if (configurators != null) {
      for (ProcessEngineConfigurator configurator : configurators) {
        allConfigurators.add(configurator);
      }
    }

    //获取当前类加载器
    if (enableConfiguratorServiceLoader) {
      ClassLoader classLoader = getClassLoader();
      if (classLoader == null) {
        classLoader = ReflectUtil.getClassLoader();
      }

      //利用spi模式加载ProcessEngineConfigurator所有实现类 将其添加到allConfigurators集合
      ServiceLoader<ProcessEngineConfigurator> configuratorServiceLoader = ServiceLoader.load(ProcessEngineConfigurator.class, classLoader);
      int nrOfServiceLoadedConfigurators = 0;
      for (ProcessEngineConfigurator configurator : configuratorServiceLoader) {
        allConfigurators.add(configurator);
        nrOfServiceLoadedConfigurators++;
      }

      if (nrOfServiceLoadedConfigurators > 0) {
        log.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators++, nrOfServiceLoadedConfigurators > 1 ? "s" : "");
      }

      //将allConfigurators进行排序,按照priority1的从大到小
      if (!allConfigurators.isEmpty()) {
        Collections.sort(allConfigurators, new Comparator<ProcessEngineConfigurator>() {
          @Override
          public int compare(ProcessEngineConfigurator configurator1, ProcessEngineConfigurator configurator2) {
            int priority1 = configurator1.getPriority();
            int priority2 = configurator2.getPriority();

            if (priority1 < priority2) {
              return -1;
            } else if (priority1 > priority2) {
              return 1;
            }
            return 0;
          }
        });

        // Execute the configurators
        log.info("Found {} Process Engine Configurators in total:", allConfigurators.size());
        for (ProcessEngineConfigurator configurator : allConfigurators) {
          log.info("{} (priority:{})", configurator.getClass(), configurator.getPriority());
        }

      }

    }
  }

初始化调用方法

在ProcessEngineConfigurationImpl调用init方法中configuratorsBeforeInit方法,它会遍历所有的allConfigurators,并调用其中的beforeInit

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /**调用所有配置器的beforeInit方法*/
  public void configuratorsBeforeInit() {
    for (ProcessEngineConfigurator configurator : allConfigurators) {
      log.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
      configurator.beforeInit(this);
    }
  }

初始化后配置方法调用

在ProcessEngineConfigurationImpl调用init方法中configuratorsAfterInit方法,它会遍历所有的allConfigurators,并调用其中的configure

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**调用所有配置的configure方法*/
  public void configuratorsAfterInit() {
    for (ProcessEngineConfigurator configurator : allConfigurators) {
      log.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
      configurator.configure(this);
    }
  }

activiti配置器的接口类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ProcessEngineConfigurator {

  /**init方法的第二个方法调用,第一个是获取所有ProcessEngineConfigurator(当前接口的实例) 在初始化前做一些操作*/
  void beforeInit(ProcessEngineConfigurationImpl processEngineConfiguration);

  /**init方法的最后一个调用,在初始化后可以做一些配置*/
  void configure(ProcessEngineConfigurationImpl processEngineConfiguration);

  /**使用实例时,首先按照priority进行裴谞,如果你有实例之间的依赖性,自己定义优先级序*/
  int getPriority();

}

activiti的bean方式配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=UTF-8
			</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password" value="fadp" />
	</bean>

	<bean id="processEngineConfigurator1" class="com.activiti_study.ch7.processEngineConfigurator1"></bean>
	<bean id="processEngineConfigurator2"  class="com.activiti_study.ch7.processEngineConfigurator2"></bean>

	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
		<property name="processEngineName" value="shareniu" />
		<property name="configurators">
		
		<list>
		  <ref bean="processEngineConfigurator1"/>
		  <ref bean="processEngineConfigurator2"/>
		</list>
		</property>
	</bean>
</beans>

activiti的实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class processEngineConfigurator1 extends AbstractProcessEngineConfigurator{
	@Override
	public void beforeInit(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("1:beforeInit ");
		processEngineConfiguration.setDatabaseSchemaUpdate("true");
	}
	@Override
	public void configure(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("1:configure ");
		String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
		System.out.println(databaseSchemaUpdate+"-----------------");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class processEngineConfigurator2 extends AbstractProcessEngineConfigurator{
	@Override
	public void beforeInit(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("2:beforeInit ");
		processEngineConfiguration.setDatabaseSchemaUpdate("true");
	}
	@Override
	public void configure(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("2:configure ");
		String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
		System.out.println(databaseSchemaUpdate+"-----------------");
	}
}

activit配置器的测试代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class App {
	@Test
	public void getProcessEngine() {
		ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("com/activiti_study/ch7/activiti1.cfg.xml");
		ProcessEngine pe1 = pec.buildProcessEngine();
	}
}

activiti配置器的测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1:beforeInit 
2:beforeInit 
1:configure 
true-----------------
2:configure 
true-----------------
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年08月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
activiti学习笔记(六) 监听器
activiti全局监听器 全局监听器主要使用的场景就是监控这个流程的启动和结束。流程开始的时候可以监控,流程结束的时候也可以监控 监听器的接口 public interface ActivitiEventListener { /**当时间被执行时调用该方法*/ void onEvent(ActivitiEvent event); /** * @author 郑小康 * 这个是onEvent执行失败之后进行的处理 * * 如果是true则返回onEvent执行失败的异常 *
cfs
2018/03/08
4K0
activiti学习笔记(三) 监听生命周期
activiti监听生命周期 activiti生命周期的作用 生命周期的作用是在构建processEngine实例时候或者关闭的时候调用对应处理方法,比如我在启动实例的时候,可以对实例做一些预处理 activiti的接口类 public interface ProcessEngineLifecycleListener { /**实体引擎实例化的时候调用该方法*/ void onProcessEngineBuilt(ProcessEngine processEngine); /**实体引擎关闭
cfs
2018/03/08
1.2K0
activiti学习笔记(二) 获取流程实例
获取流程实例 流程实例获取的源码解析        以获取默认的流程实例为例,来解释整个流程实例的获取过程 文件位置:/org/activiti/engine/ProcessEngines.java     第一步:通过getDefaultProcessEngine来获取,可以看出其调用的当前类的getProcessEngine方法。 //获取默认的流程引擎实例 NAME_DEFAULT="default" public static ProcessEngine getDefaultProcessEn
cfs
2018/03/08
9670
activiti学习笔记(一) 获取流程配置实例
activiti获取流程配置实例 流程配置的获取方法api        流程配置的获取共有七种方法,但是只分为三类,一类是根据配置文件路径进行获取、一类是根据流文件获取、还有一类是构建一个空的实例,根据类的默认属性来获取 /** * @author 郑小康 * 流程引擎配置共有七种方法 * 方法1 方法2调用的实际是方法3 * 方法4 调用其实就是方法5 * 方法6 和方法7是相同 * */ //方法1 //实际调用的方法三只不过默认beanName是pro
cfs
2018/03/08
8420
工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例
查询API也允许对tenantId使用like语法, 也可以过滤未设置tenantId的实体
攻城狮Chova
2022/01/22
1.6K0
工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例
第二章:activiti工作流连接数据库,和eclipse安装activiti插件
下面我们写一个连接数据库的测试类,把activity需要的24张表建出来,首先建个数据库:
全栈程序员站长
2022/08/05
5290
第二章:activiti工作流连接数据库,和eclipse安装activiti插件
activiti表的创建和简单示例
周杰伦本人
2023/10/12
2960
activiti表的创建和简单示例
【第四篇】Camunda系列-ProcessEngine核心对象
  ProcessEngine是Camunda流程引擎的核心。我们在流程中的很多具体的处理比如流程部署、流程部署、流程审批等操作都是通过XXXService来处理的。而相关的XXXService都是通过ProcessEngine来管理的。所以对于ProcessEngine的创建方式还是很有必要掌握的。
用户4919348
2022/10/27
3.3K0
【第四篇】Camunda系列-ProcessEngine核心对象
第二节:Activiti6.0配置文件的读取
概述:ProcessEngineConfiguration对象代表一个Activiti流程引擎的全部配置,该类提供一系列创建ProcessEngineConfiguration实例的静态方法,这些方法用于读取和解析相应的配置文件,并返回ProcessEngineConfiguration的实例。出这些静态方法外,该类为其他可配置的引擎属性提供相应的setter和getter方法
凡人飞
2020/09/20
8990
工作流引擎使用详解!工作流框架Activiti的详细配置以及安装和使用
创建ProcessEngine Activiti流程引擎的配置文件是名为activiti.cfg.xml的XML文件.注意与使用Spring方式创建流程引擎是不一样的ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()它会在classpath下搜索activiti.cfg.xml,并基于这个文件中的配置构建引擎<beans xmlns="http://www.springframework.org/schema/bean
攻城狮Chova
2022/01/02
1.6K0
工作流引擎使用详解!工作流框架Activiti的详细配置以及安装和使用
Activiti7 生成表结构
首先创建一个Maven项目 整体的项目结构  activiti.cfg.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt
彼岸舞
2020/09/30
1.1K0
flowable入门
在使用 flowable框架的时候,首先需要引入 flowable的jar包,flowable maven仓库地址为:
全栈程序员站长
2022/08/31
5510
flowable入门
Spring Boot + Activiti 完美结合,快速实现工作流
关于工作流之前分享过一篇flowable,今天分享一下另外一个实现:Activiti
终码一生
2023/01/08
1.3K0
Spring Boot + Activiti 完美结合,快速实现工作流
项目实践工作流之Activiti学习(九)
在 activiti.cfg.xml 中配置数据源和 processEngineConfiguration
用户1289394
2023/10/24
1430
项目实践工作流之Activiti学习(九)
Activiti7笔记(一)Activiti7是什么,入门流程操作的代码实现
Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
一写代码就开心
2022/05/09
3.2K0
Activiti7笔记(一)Activiti7是什么,入门流程操作的代码实现
Activity工作流引擎学习笔记(一)「建议收藏」
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/08
1.6K0
Activity工作流引擎学习笔记(一)「建议收藏」
建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
程序员白楠楠
2020/11/18
4100
工作流引擎 Activiti 万字详细入门
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/08
2.6K0
工作流引擎 Activiti 万字详细入门
Activiti7实战-入门
Bpmn 图形其实是通过 xml 表示业务流程,上边的.bpmn 文件使用文本编辑器打开:
全栈程序员站长
2022/11/19
6540
Activiti7实战-入门
Activiti7工作流引擎-Activiti7环境准备
作用:用于测试 activiti 的 api,提供各种 service 接口。需要创建一个数据库:仅仅有 activiti 的数据表
cwl_java
2019/12/30
4.1K0
Activiti7工作流引擎-Activiti7环境准备
相关推荐
activiti学习笔记(六) 监听器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档