• activiti源码分析学习


    activiti源码分析学习导语

    目前项目中用activiti来做工作流的相关工作,最近遇到一些情况下,公司二次开发的流程图渲染出现了问题,会造成流程图出不来的情况。初步分析数据库中记录以及简单的代码跟踪,发现绘制流程路线图时,是按to_number(id_)来进行排序,预期是先发生的行为它的id_字段一定小。

    select * from act_hi_actinst order by to_number(id_);

    但是跟踪时候,发现明明后发生的行为,但是id_字段值却还更小:

    image

    于是觉得是IdGenerator那边生成记录主键的时候出问题了,但是还不确定,于是决定去看看源码。没想到,一看源码才知道,人家根本就不是实施入库,而是对每个command,进行session缓存,之后flush()一起入库。由此,有了更进一步探知它的内部实现的欲望。

    源码分析

    首先推荐网上文章:activiti-engine源码分析

    作者的水平很好,在讲解内容的时候加入了对于面向对象编程、对于设计模式、对于团队工作等的理解,内容解说图文结合,感觉比较到位。

    后续的内容只是一些细节的补充。

    CommandIntercepter命令拦截器链

    命令拦截器,它实际上扮演的是“命令模式”中的Invoker-即请求者角色。

    对使用StandaloneProcessEngineConfiguration配置实现的情况,默认生成以下的拦截器链:

    LogInterceptor >> CommandContextInterceptor >> CommandInvoker

    其中:

    • LogInterceptor就是简单的记录日志;
    • CommandContextInterceptor事前添加命令上下文,事后控制关闭session;
    • CommandInvoker负责执行具体命令;

    对使用JtaProcessEngineConfiguration配置实现的情况,默认会添加事物拦截器:

    LogInterceptor >> CommandContextInterceptor >> JtaTransactionInterceptor >> CommandInvoker

    其中,JtaTransactionInterceptor用于实现JTA事物,依赖于JTA的具体实现。

    持久层mybatis的statement规则

    1.持久层的实体必须以Entity结尾,它的命名在后续会有使用到;

    2.mybatis中对statement命名遵循以下命名约束(假定对Property对象):

    • insertModelName 插入一条记录
    • updateModelName 更新一条记录
    • selectModelName 选择一条记录
    • selectModelNameCountsByCriteria 对单表进行过滤查询,返回记录数
    • selectModelNamesByCriteria对单边进行过滤查询,返回详细记录

    在持久层构造SQL过程中,用到一些内容的说明:

    • ModelNameEntity 模型对象;
    • ModelNameEntityManager 封装对模型的数据库操作;
    • ModelNameQueryImpl不一定存在,如果存在,则是对查询的条件过滤;它的设计上类似JQuery的连续命名模式,目前crateria基本上都是这种实现。
    • DbSqlSessionFactory用于获取DbSqlSession,维护所有statement并提供获取statement的实现;
    • DbSqlSession执行具体的操作。
  • 相关阅读:
    https://blog.csdn.net/nameofcsdn/article/details/53164652
    洛谷
    模板
    模板
    Gym 101911E "Painting the Fence"(线段树区间更新+双端队列)
    Gym 101911F “Tickets”
    图论:最小瓶颈生成树
    图论:次小生成树
    图论:费用流-SPFA+EK
    图论:Dinic算法
  • 原文地址:https://www.cnblogs.com/huntdream/p/6008002.html
Copyright © 2020-2023  润新知