Activiti 命令模式详解

2017-06-25 20:47:34

请关注唯心的个人微信公众号:craft6-cn(中划线,也可以搜索:领域驱动业务建模)

Activiti 命令模式详解

作者 | 颜超敏

网站:craft6.cn。公众号:craft6-cn


1

命令模式和扩展

先贴一个命令模式的简要图,以便重温一下命令模式。

命令模式简图.jpg

  • Client:业务调用者

  • Service:命令调用者,也称为Receiver

  • Executor:命令执行者,也称为Invoker。

  • Command:命令接口,一般只有一个执行方法。

  • ConcereteCommand:具体的命令实现。由Service调用和实例化,然后传给Executor来执行。


整个模式的关键点在于:

  • 对于Client而言,是屏蔽Command细节的,即它是不知道系统里面的业务实际上是通过Command来完成的。

  • Service每个对外方法和普通的没什么区别,可以都是常规的参数,只是在里面构造各个Command的实现类实例,传入相关的参数,并调用Executor执行者执行。


扩展方式

基于前面的命令模式简图,我们再扩展一下:

命令模式简图-2.jpg

图中黄色的两部分是扩展方式:

  • ExecutorInterceptor:命令执行者的拦截器。可以在执行之前和之后执行, 可以用于做日志、校验、重试、入栈(以便回退)等等。通过责任链的方式在Executor中维护ExecutorInterceptor,并可以动态增减不同的拦截器实现类。

  • CommandContext:命令执行者上下文信息。除了构造Command时传入的参数外,命令执行还需要一些公共的上下文信息,可以通过这个类统一维护,每个ConcereteCommand都可以调用。




2

Activiti的命令模式(简图)


Activiti 深入使用了命令模式来实现系统各个功能,比如更改流程状态、创建任务、执行任务、删除任务等等,可以说阅读Activiti源码,首先要理解的就是它无处不在的命令模式。


先上一个简图,了解Activiti命令模式的主要结构:

Activiti命令模式简图.jpg


  • Command:命令接口,定义执行方法。1)执行方法支持传入CommandContext(命令上下文),并且通过每个Command的实现类的构造函数传入该命令需要特定的参数。

  • CommandContext:维护各个命令所需的通用上下文信息,包括流程定义、流程实例等等。

  • CommandExecutor:命令执行者,注意在里面初始化该实体时,会传入流程配置(这点在下面详图再说嘛)

  • CommandInterceptor:实例化CommandExecutor时,会设置拦截器的列表,并通过重新组织形成【责任链模式】

  • CommandConfig:对于命令拦截器责任链的功能开关设置,比如是否支持事务等,通过它来关于那些拦截器要不要执行。

  • TaskServiceImpl:对外服务接口的实现类,通过调用具体的Command实现(比如图中的DeleteTaskCmd)来完成相应的业务实现。



3

Activiti 的命令模式(详图)

引擎、命令和执行.jpg


在我们对第二章内容有基本了解后,我们继续看一个详细图,这个图是基于前面简图深化,增加一个代码的关键点:


    CommandExecutor和CommandInterceptor是怎样实例化的? 它们怎么和流程定义相关配置关联起来?


先看一下在流程定义的配置文件中,会配置什么内容:

QQ截图20170504140007.png


这是很常规的代码,基本上每个和Activiti集成的项目都会用到

这段配置方式。


1)这里定义了流程配置,通过SpringProcessEngineConfiguration子类(它继承了ProcessEngineConfigurationImpl)。


2)然后把该bean注入给processEngine,注意它使用的class是ProcessEngineFactoryBean,它的getObject方法返回的是ProcessEngine的实例。


3)通过ProcessEngineConfigurationImpl的initCommandExecutor实例化CommandExecutor,并且将前面定义的processEngineConfiguration也传给它。


4)通过ProcessEngineConfigurationImpl的initInterceptorChain来构造CommandInterceptor的责任链。


经过这样,当每次使用CommandExecutor执行Command时,便会基于流程的统一定义、所有配置好的CommandInterceptor责任链来拦截处理业务。


至于Activiti的代码我就不重复粘贴上来了,本文主要给Activiti相关开发人员阅读使用,对Activiti不了解的读者作用不太大。


作 者 简 介


    唯心,颜超敏。 专注Java开源技术和电商、CRM、工作流系统分析、业务建模。

    个人网站:www.craft6.cn

    本文原创,转载请注明出处。





可通过扫描左侧二维码阅读本文。本站文章均为颜超敏原创,欢迎转载,请注明出处即可,转载可通过下面的社会化工具快速完成。

分享到:


为您推荐这些文章,如果感兴趣,请继续阅读吧:

Activiti 命令模式详解

activiti,命令模式

本文阐述了命令模式的基本元素、扩展方式,以及深入说明了在Activiti无处不在的命令模式是怎样设计的,方便我们阅读理解Activiti的源码。

颜超敏,唯心六艺,Craft6.cn,电子商务博客,电子商务研发,电商研发,电子商务研究,电商研究,电子商务专家,电商专家,电子商务知识,电商知识,电子商务教程,电商教程,电子商务模式,电子商务平台,电子商务商业模式,电子商务数据库设计,电商数据库设计,电子商务系统分析,Java架构设计,Java软件架构,B2C,O2O,o2o模式,o2o电子商务,o2o电子商务平台,中国电子商务,电子商务平台建设方案
粤ICP备14060523号 Copyright @2014 -唯心六艺软件