activiti源码分析学习导语

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

select * from act_hi_actinst order by to_number(id_);

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

于是觉得是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执行具体的操作。

最新文章

  1. C#开发微信公众平台-就这么简单(附Demo)(转)
  2. paip.不同目录结构哈的文件批量比较
  3. @ManyToMany中间表附加字段设计
  4. QT错误:collect2:ld returned 1 exit status
  5. jQuery Moblile Demos学习记录Panel
  6. Xcode自带iOS测试方法
  7. session垃圾回收机制
  8. Python实现Telnet自动连接检测密码
  9. EOS开发入门
  10. Flask-----轻量级的框架,快速的搭建程序
  11. JavaScript Closures 闭包
  12. Django:model中的ForeignKey理解
  13. Tomcat配置https、访问http自动跳转至https
  14. day26<网络编程>
  15. 核心API的使用(给定一个字符串,统计每个字符出现的次数)
  16. 在html中怎么格式化输出json字符串
  17. .Net线程问题解答
  18. Entity Framework在不同数据库下的配置
  19. redis & macOS & python
  20. docker 清理容器和镜像

热门文章

  1. Service Intent must be explicit的解决方法
  2. Gradle 命令之 --stacktrace , --info , --debug 用法
  3. svnsync备份
  4. thinkphp3 行为(behavior)分析和基本使用
  5. Consul 服务发现与配置
  6. P2015 二叉苹果树
  7. P2657 [SCOI2009]windy数
  8. 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理
  9. java基础-基本的输入与输出
  10. Linux安装python模块