2023最新版本Activiti7系列-源码篇-初始化过程

news2025/1/12 12:05:37

在这里插入图片描述

源码分析

在这里插入图片描述

1.设计模式

1.1 命令模式

https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89115420
在这里插入图片描述

1.2 责任链模式

https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89077040

2.初始化过程

在这里插入图片描述

2.1 入口代码

  我们在SpringBoot项目中来看Activiti7的源码。首先要找到的是自动装配的入口。在activiti-spring-boot-starterspring.factories中找到自动配置类ProcessEngineAutoConfiguration这个配置类

在这里插入图片描述

  进入到ProcessEngineAutoConfiguration中可以看到完成了SpringProcessEngineConfiguration的注入。我们再进入父类AbstractProcessEngineAutoConfiguration中。

    @Bean
    public ProcessEngineFactoryBean processEngine(SpringProcessEngineConfiguration configuration) {
        return super.springProcessEngineBean(configuration);
    }

看到了ProcessEngineFactoryBean这让我们联想到了是getObject()方法。然后进入到springProcessEngineBean方法中。

    public ProcessEngineFactoryBean springProcessEngineBean(SpringProcessEngineConfiguration configuration) {
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(configuration);
        return processEngineFactoryBean;
    }

再进入到ProcessEngineFactoryBeangetObject方法

    public ProcessEngine getObject() throws Exception {
        this.configureExpressionManager();
        this.configureExternallyManagedTransactions();
        if (this.processEngineConfiguration.getBeans() == null) {
            this.processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(this.applicationContext));
        }

        this.processEngine = this.processEngineConfiguration.buildProcessEngine();
        return this.processEngine;
    }

关键是processEngineConfiguration.buildProcessEngine();这行代码。进入buildProcessEngine方法中查看。即进入到了ProcessEngineConfigurationImpl类中,并且调用了下面的方法。

  @Override
  public ProcessEngine buildProcessEngine() {
    init();
    ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
    postProcessEngineInitialisation();

    return processEngine;
  }

ProcessEngineConfigurationImpl的作用:配置和初始化Activiti的流程引擎。通过该类,可以对流程引擎的各种参数进行配置,包括数据库连接信息事务管理器缓存管理器作业执行器等。同时,该类还提供了创建和获取ProcessEngine实例的方法,用于启动和管理流程引擎的运行。

2.2 init方法

  init()方法的作用是初始化Activiti引擎的配置,为引擎的正常运行做准备。

public void init() {
  initConfigurators();
  configuratorsBeforeInit();
  initHistoryLevel();
  initExpressionManager();

  if (usingRelationalDatabase) {
    initDataSource();
  }

  initAgendaFactory();
  initHelpers();
  initVariableTypes();
  initBeans();
  initScriptingEngines();
  initClock();
  initBusinessCalendarManager();
  initCommandContextFactory();
  initTransactionContextFactory();
  initCommandExecutors();
  initServices();
  initIdGenerator();
  initBehaviorFactory();
  initListenerFactory();
  initBpmnParser();
  initProcessDefinitionCache();
  initProcessDefinitionInfoCache();
  initKnowledgeBaseCache();
  initJobHandlers();
  initJobManager();
  initAsyncExecutor();

  initTransactionFactory();

  if (usingRelationalDatabase) {
    initSqlSessionFactory();
  }

  initSessionFactories();
  initDataManagers();
  initEntityManagers();
  initHistoryManager();
  initJpa();
  initDeployers();
  initDelegateInterceptor();
  initEventHandlers();
  initFailedJobCommandFactory();
  initEventDispatcher();
  initProcessValidator();
  initDatabaseEventLogging();
  configuratorsAfterInit();
}

上面初始化的内容有很多。我们先来看几个关键的:

  • initCommandContextFactory();
  • initTransactionContextFactory();
  • initCommandExecutors();
  • initServices();

2.2.1 initCommandContextFactory

  initCommandContextFactory方法的作用很简单,完成ProcessEngineConfigurationImpl中的commandContextFactory属性的初始化操作。

public void initCommandContextFactory() {
  if (commandContextFactory == null) {
    commandContextFactory = new CommandContextFactory();
  }
  commandContextFactory.setProcessEngineConfiguration(this);
}

2.2.2 initTransactionContextFactory

  initTransactionContextFactory方法的作用也很简单,完成ProcessEngineConfigurationImpl中的transactionContextFactory属性的初始化操作。

public void initTransactionContextFactory() {
  if (transactionContextFactory == null) {
    transactionContextFactory = new StandaloneMybatisTransactionContextFactory();
  }
}

2.2.3 initCommandExecutors

  initCommandExecutors这是一个非常重要的方法。会完成责任链中相关拦截器的组织和加载。里面的方法有

  • initDefaultCommandConfig() :初始化defaultCommandConfig属性【可重用Context上下文,支持事务传播属性】
  • initSchemaCommandConfig() :初始化schemaCommandConfig属性【不可重用Context上下文,不支持事务传播属性】
  • initCommandInvoker() :初始化commandInvoker属性。这个是责任链路中的最后一个节点
  • initCommandInterceptors() :初始化commandInterceptors属性,组装所有的拦截器到集合中
  • initCommandExecutor():初始化commandExecutor属性,完成责任链的关联并绑定链路的第一个节点【first】

核心代码:

public void initCommandExecutor() {
  if (commandExecutor == null) {
      // 获取责任链中的第一个拦截器    初始化责任链
    CommandInterceptor first = initInterceptorChain(commandInterceptors);
    commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first);
  }
}

public CommandInterceptor initInterceptorChain(List<CommandInterceptor> chain) {
  if (chain == null || chain.isEmpty()) {
    throw new ActivitiException("invalid command interceptor chain configuration: " + chain);
  }
    // 设置责任链
  for (int i = 0; i < chain.size() - 1; i++) {
    chain.get(i).setNext(chain.get(i + 1));
  }
  return chain.get(0); // 返回第一个节点
}

对应的图解:

在这里插入图片描述

2.2.4 initServices

  在Activiti7中我们完成各种流程的操作,比如部署查询流程定义流程审批等各种操作都是通过xxxService来完成的。这些service在ProcessEngineConfigurationImpl中的成员变量中就会完成对象的实例化。

  protected RepositoryService repositoryService = new RepositoryServiceImpl();
  protected RuntimeService runtimeService = new RuntimeServiceImpl();
  protected HistoryService historyService = new HistoryServiceImpl(this);
  protected TaskService taskService = new TaskServiceImpl(this);
  protected ManagementService managementService = new ManagementServiceImpl();
  protected DynamicBpmnService dynamicBpmnService = new DynamicBpmnServiceImpl(this);

  在init方法的initServices完成的操作是和上面实例化的commandExecutor完成绑定。也就是xxxService中的各种执行操作最终都是由commandExecutor来完成的。

  public void initServices() {
    initService(repositoryService);
    initService(runtimeService);
    initService(historyService);
    initService(taskService);
    initService(managementService);
    initService(dynamicBpmnService);
  }

绑定commandExecutor

  public void initService(Object service) {
    if (service instanceof ServiceImpl) {
      ((ServiceImpl) service).setCommandExecutor(commandExecutor);
    }
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DTCC 2023即将启幕 明天见!

8月16日-18日&#xff0c;由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第14届中国数据库技术大会&#xff08;DTCC2023&#xff09;将在北京举行 作为国内云原生数据仓库代表厂商&#xff0c;酷克数据受邀亮相DTCC 2023&#xff0c;与广大数据库领域从业人士共同分享云…

财务人员学python有意义吗,财务会python好找工作吗

这篇文章主要介绍了财务方面python需要什么水平&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 财务是一个比较特殊的工作岗位&#xff0c;每天需要接触各种各样的数据&#x…

【数理知识】三维空间旋转矩阵的欧拉角表示法,四元数表示法,两者之间的转换,Matlab 代码实现

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】最…

SpringBoot复习:(52)不再需要使用@EnableTransactionManagement的原因

在Spring项目中&#xff0c;要用事务&#xff0c;需要EnableTransactionManagement注解加Transactional注解。而在SpringBoot项目&#xff0c;有事务的自动配置类TransactionAutoConfiguration,代码如下&#xff1a; 可以在其内部类EnableTransactionManagementConfiguratio…

06 - 文件的差异和恢复

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 文件的差异2. 文件的恢复 工作区&#xff1a;本地进行修改的code 暂存区&#xff1a;执行了 git add <filename> 命令之后 版本库&#xff1a;执行了 git commit <...>…

Redis数据结构——跳跃表

跳跃表 先来回顾常规的跳跃表。 &#xff01;&#xff01;&#xff01;下面的图片和内容都来自于这个链接Redis数据结构——跳跃表 - 随心所于 - 博客园 对于一个有序的链表&#xff0c;我们如何才能快速定位一个元素呢&#xff1f;只能遍历&#xff0c;时间复杂度是O(N)&…

Bitcoin 加速交易操作示例

这里以 Bitcoin Ordinals NFT 为例&#xff0c; 进行加速交易演示 第1步&#xff1a;新建子账户 温馨提示&#xff1a;如果有多条鱼未确认&#xff0c;也只需1个账户即可&#xff0c;不必搞多个子账户 第2步&#xff1a;切换回到老地址&#xff08;Account 1&#xff09; 第3步…

Springboot + Vue ElementUI 实现MySQLPostgresql可视化

一、功能展示&#xff1a; 效果如图&#xff1a; DB连接配置维护&#xff1a; Schema功能&#xff1a;集成Screw生成文档&#xff0c;导出库的表结构&#xff0c;导出表结构和数据 表对象操作&#xff1a;翻页查询&#xff0c;查看创建SQL&#xff0c;生成代码 可以单个代码文…

获取部门完整路径数据

1: 获取部门数据 (基础) SELECT id, CONCAT(pid_path,id) as pid_path2,pid_path,title FROM web_department;2: 获取部门数据 (进阶, 但是是,分隔) SELECT t1.id, t1.title, CONCAT(t1.pid_path, ,, t1.id) AS pid_path,(SELECT GROUP_CONCAT(t2.title ORDER BY FIND_IN_SET…

Unity 实现2D地面挖洞!涂抹地形(碰撞部分,方法二)

文章目录 前言一、初始化虚拟点1.1点结构:1.2每个点有的状态:1.3生成点结构: 二、实例化边缘碰撞盒2.1计算生成边缘碰撞盒 三、涂抹部分3.1.虚拟点3.2.鼠标点3.3.内圈3.4.外圈 四、关于优化结语: 前言 老规矩先上效果图 继上一篇涂抹地形文章讲解发出后&#xff0c;有不少网友…

与微服务平台厂家联手,一起实现高效率发展!

在如今的快节奏发展社会中&#xff0c;只有利用科技的力量&#xff0c;才能与市场接轨&#xff0c;了解市场和客户需求&#xff0c;最终实现更快速的发展。如果还停留在闭门造车的环境中&#xff0c;不“引进来&#xff0c;走出去”&#xff0c;那势必会与成功擦肩而过。微服务…

SpringSecurity结合电商项目

pom <!--SpringSecurity及JWT依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</ artifactId></dependency> <!--Hutool Java工具包--> <dependency>&l…

面试热题(每日温度)

请根据每日 气温 列表 temperatures &#xff0c;重新生成一个列表&#xff0c;要求其对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 输入: temperatures [73,74,75,71,69…

ADC实验

查看VR1链接的丝印&#xff1a;XadcAIN3 设置相关寄存器 使用的是通道3&#xff0c;要设置相应的通道寄存器 #include "exynos_4412.h"int main() {unsigned int AdcValue 0;/*将ADC的精度设置成 12bit*/ADCCON ADCCON | (1 << 16);/*使能ADC的分频器*…

Python Flask+Echarts+sklearn+MySQL(评论情感分析、用户推荐、BI报表)项目分享

Python FlaskEchartssklearnMySQL(评论情感分析、用户推荐、BI报表)项目分享 项目背景&#xff1a; 随着互联网的快速发展和智能手机的普及&#xff0c;人们越来越倾向于在网上查找餐厅、购物中心、酒店和旅游景点等商户的点评和评分信息&#xff0c;以便做出更好的消费决策。…

第三代网关,POE级联蓝牙网关VDB3601,至多可连接38台蓝牙设备

第三代蓝牙网关&#xff0c;网关集成了蓝牙4.2/5.0WiFi无线协议&#xff0c;采用双网口设计&#xff0c;1台主蓝牙网关可级联多个从蓝牙网关设备&#xff0c;至多支持远距离连接和控制38台蓝牙设备的蓝牙网关VDB3601&#xff0c;支持双蓝牙模组、485通信、可兼容4G/Cat.1模块&a…

敏捷项目管理如何做好Sprint Backlog?迭代管理

什么是Sprint Backlog&#xff1f; Sprint Backlog是Scrum的主要工件之一。在Scrum中&#xff0c;团队按照迭代的方式工作&#xff0c;每个迭代称为一个Sprint。在Sprint开始之前&#xff0c;PO会准备好产品Backlog&#xff0c;准备好的产品Backlog应该是经过梳理、估算和优先…

STM32CUBE IDE 使用F407的CCMRAM

F407有64K的CCMRAM闲着怪浪费&#xff0c;用一下 使用STM32CUBE IDE配置。只需要在定义的变量后面加 __attribute__((section(".ccmram") ))即可。不用修改FLASH.LD文件。 举例使用LVGL定义一个大数组并使用&#xff1a; #define MY_DISP_HOR_RES (320)/* Examp…

聊聊智能手表

目录 1.什么是智能手表 2.智能手表的发展过程 3.智能手表有哪些功能 4.智能手表给人类带来的福利 1.什么是智能手表 智能手表是一种智能穿戴设备&#xff0c;结合了传统手表的时间显示功能和智能手机的一些功能。它通常配备有触摸屏、操作系统、处理器、内存、传感器以及与智…

jpg图片太大怎么压缩?这样做轻松压缩图片

图片太大会给存储、分享带来麻烦&#xff0c;但其实现在压缩图片大小也不是什么难事&#xff0c;下面就给大家分享几个一直用的图片压缩方法&#xff0c;包含批量压缩、在线压缩、免费压缩等多种方式&#xff0c;大家按需自取哈~ 方法一&#xff1a;嗨格式压缩大师 这是一个可…