加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Activiti学习心得

(2017-02-05 11:57:03)
标签:

it

工作流引擎Activiti用了一年左右,总该写点什么记录总结下吧。以下内容纯属个人瞎BB,欢迎各位看官拍砖。Activiti概念性的东西以及API的用法,我就不在此文中描述,请各位看官自行Google或者Baidu吧。

Activiti抽象出流程定义以及流程流转关系,流程的业务逻辑还是需要开发者开发,一个框架敢开源出来,必有过人之处。因个人能力以及时间有限,未能完全吃透整个Activiti框架。只能在遇到问题过程中,不断学习,解决问题,举一反三,挖出冰山一角。就从我在开发过程中遇到的以下问题或者学习心得中展开吧。注:以下Activiti均与Spring配合使用。

问题一:Activiti分为如下服务:RepositoryService(流程定义文件的管理)、RuntimeService(流程运行时)、TaskService(流程任务的管理)、HistoryServiceManagementService(流程引擎的管理维护)等,每种服务Activiti都规定好了其功能及作用,我们能否也扩展自定义的服务,但事务控制、异常控制等仍由Activiti帮我们控制,只开发业务逻辑即可?

解决方法:请看ActivitiSpring的配置。

    http://s2/mw690/002tmE8Gzy78xDX2mlz91&690

虽然SpringProcessEngineConfiguration.jara 是Spring定义的工作流引擎启动类,但该类实际上继承了ProcessEngineConfigurationImpl.java,绝大部分配置仍由该类启动。接下来就看看上述讲到定义好的服务是如何启动的,请看源码截图:


http://s15/mw690/002tmE8Gzy78xDYW0lE8e&690
http://s16/mw690/002tmE8Gzy78xE0drPxbf&690

因此该问题的解决思维也很清晰了,先实例化自定义的服务类,调用initService方法进行变量的初始化。个人的解决法如下:

1)自定义Spring配置的启动类CustomSpringProcessEngineConfiguration.java,继承了SpringProcessEngineConfiguration.java类:


http://s2/mw690/002tmE8Gzy78xE2mlUJc1&690

(2)CustomSpringProcessEngineConfiguration.java代码如下,先获取自定义的实例:    CustomServiceImpl,再调用父类的initService方法初始即可。


http://s12/mw690/002tmE8Gzy78xE3TwaDcb&690

问题二:为了使同一个流程图可适用于多种业务流程,将流程的监听动态配置化?本来Activiti5.21.0提供了更方便的DynamicBpmnService.java,用于动态定义流程图。无奈生产环境仍用5.16.0版本无此新特性,只好看菜吃饭,看源码搞起。

解决方法:还是看ProcessEngineConfigurationImpl.java源码,该类是核心类,建议多看看。截图如下:

1)初始化部署器时,会获取默认的部署器

http://s14/mw690/002tmE8Gzy78xDx5ckJ7d&690

2在获取默认部署器中,会获取默认的流程图解析处理器

http://s3/mw690/002tmE8Gzy78xDC8MUie2&690
       http://s11/mw690/002tmE8Gzy78xDCcnbQ9a&690

3在获取默认流程图解析处理器时,当有自定义的流程图解析处理器时,会将默认的处理器替换掉。

http://s1/mw690/002tmE8Gzy78xDL7DwIa0&690

因为该问题的解决思路也很清晰了,自定义的解析处理器需继承默认的解析处理器,调用父类解析方法后,用强行加入我们的解析逻辑,个人的代码如下:

1ActivitiSpring的配置如下:

http://s15/mw690/002tmE8Gzy78xDOFDb07e&690

(2)只选取CustomSequenceFlowParseHandler.java讲解。该类是自定义了流程中路径的解析逻辑,需继承父类SequenceFlowParseHandler.java 才会被引擎启动类所识别并替换。因为自定义的解析处理器是会替换掉默认的处理器,所以在executeParse方法,需调用父类的executeParse方法,工作流中对路径解析的逻辑才会被加载。然后接下就我们解析的处理逻辑了:根据数据库中定义好的流程监听,符合条件的监听就会去动态加载。请记住,因为应用将流程启动后,该类只加载一次,流程的解析已在内存里,所以此处我设置了两级监听,一级监听只加载定义好的监听分发器,当业务流程启动后,一级分发监听再去加载二级业务监听,达到动态加载。

 

http://s2/mw690/002tmE8Gzy78xDQgvK1c1&690

 

学习心得一:每个开源框架因使用了设计模式,从而更加精彩,Activiti也不例外,用得最多的莫过于命令模式了,没心情写了,待定吧

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有