activiti源码分析学习
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执行具体的操作。
activiti源码分析学习的更多相关文章
- ACTIVITI 源码研究之命令模式执行
ACTIVITI 是一个优秀开源软件,通过阅读源码,我们不但可以了解工作流引擎执行的原理还可以增加个人的编码功力. ACTIVITI 所有执行过程都是采用命令模式进行执行. 本文主要描述流程引擎数据保 ...
- activiti源码分析(一)设计模式
对activiti有基本了解的朋友都知道,activiti暴露了七个接口来提供工作流的相关服务,这些接口具体是如何实现的呢?查看源码发现其实现的形式大体如下: public class Runtime ...
- Activiti源码浅析:Activity与Task
最近由于接触到Activiti工作流引擎,因此粗读了一下它的源码. 总结了一些内容如下,这些内容一般的doc上都是没有提及的. 1. model.Activity与model.Task Activit ...
- jquery源码分析学习地址
http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...
- jquery 源码分析学习地址
http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...
- jQuery源码分析学习--资料收集--更新中
1.逐行分析jQuery源码的奥秘 - 网易云课堂 http://study.163.com/course/courseMain.htm?courseId=465001#/courseDetail? ...
- Java并发之线程池ThreadPoolExecutor源码分析学习
线程池学习 以下所有内容以及源码分析都是基于JDK1.8的,请知悉. 我写博客就真的比较没有顺序了,这可能跟我的学习方式有关,我自己也觉得这样挺不好的,但是没办法说服自己去改变,所以也只能这样想到什么 ...
- activiti 源码笔记之startProcess
rumtimeService.startProcessInstanceByXX方法将启动流程的任务委派给StartProcessInstanceCmd,此时会根据rumtimeService.star ...
- activiti源码解读之心得整编
TaskService.completeTask()的执行内幕是啥? activiti采取了command模式,completeTask会被包装成一个CompleteTaskCmd,一个Cmd执行的时 ...
随机推荐
- 解题:BJOI 2006 狼抓兔子
题面 可以看出来是最小割,然后你就去求最大流了 这么大的范围就是让你用网络流卡的?咋想的啊=.=??? 建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最 ...
- redis3.2装完后 其它机子访问爆protocol error, got 'n' as reply type byte
服务器上装了reids3.2版本,配置文件中已将bind的选项注释掉, linux的iptables的redis端口也开放 其它机子的PHP访问redis爆“protocol error, got ' ...
- 关于ASP.NET MVC的Html.BeginForm()方法
http://zhidao.baidu.com/link?url=9j53URZJv2B9W-TPtQAaKCRbqIcYy2r3WNO0NDzciTON0EYj5Hhd3rl3UlIllK1CqOC ...
- Linux服务器修改文件句柄数和用户最大进程数限制
1.临时修改的方法:ulimit -HSn 102400此方法当前会话有效 2.永久修改方法(修改单个进程打开的最大句柄数)修改vi /etc/security/limits.conf,在后面添加一下 ...
- C#线程篇---Windows调度线程准则(3)
Windows本身就是一个抢占式操作系统,它的实现,必定有某种算法在里面,比如什么时候调度哪些线程,需要花费多长时间等问题. 我们时时在用Windows,作为程序员,我们有必要知道其中最贴近我们的算法 ...
- 21天实战caffe笔记_第一天
1 深度学习术语 深度学习常用名词:有监督学习.无监督学习.训练数据集.测试数据集.过拟合.泛化.惩罚值(损失loss); 机器自动学习所需三份数据:训练集(机器学习的样例),验证集(机器学习阶段,用 ...
- 布谷鸟搜索算法CS
0 引言 布谷鸟搜索(Cuckoo Search,CS)是由 Xin-She Yang 和 Suash Deb 于 2009 年开发的自然启发式算法.CS 基于布谷鸟的寄生性育雏(brood para ...
- linux常见故障一:linux 文件系统变只读
1. 重启系统看是否可以自动修复. 2. 使用fsck -y /dev/sda1 进行自动修复.(用”-y”选项来执行该命令对硬盘进行检查和修复) 添加参数:fsck -y -C -t ext3 ...
- memcmp 和 memcpy使用
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...
- swiper隐藏再显示出现点击不了情况
//初始化swiper var swiper = new Swiper('.swiper-container', { pagination: '.swiper-pagination', nextBut ...