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://www.cnblogs.com/huntdream/p/6008002.html