【工作流前进之路】Activiti 研究之拦截器
来源:互联网 发布:淘宝图片添加热区 编辑:程序博客网 时间:2024/06/05 00:35
Activiti提供了拦截器功能,外界对Activiti流程中各个实例的操作,可以看作是对数据进行操作.Aciviti使用了命令模式和职责链模式来完成这一系列的操作.在介绍Activiti的拦截器之前,需要先来介绍两个GOF中的设计模式:命令模式和职责链模式
一.命令模式
在GOF的设计模式中,命令模式属于行为型模式,命令模式的官方定义为:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;请求排队或记录请求日志,以及支持可撤销操作.其类图如下:
具体代码不贴了.
二.职责链模式
职责链模式同命令模式一样,也是属于行为型模式,它的官方定义是:使用多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
具体的代码就不贴了.
三.自定义拦截器
在前面,对命令模式和职责链模式进行解释,Activiti的拦截器,就是结合这两个设计模式完成的,在理解Activiti的拦截器之前,我们来自己定义一个拦截器.
拦截器代码:
/** * 拦截器实现A */import org.activiti.engine.impl.interceptor.Command;import org.activiti.engine.impl.interceptor.CommandInterceptor;public class InterceptorA extends CommandInterceptor {@Overridepublic <T> T execute(Command<T> command) {//输入字符串和命令System.out.println("this is InterceptorA----->"+command.getClass().getName());//然后让职责链中的下一个请求处理者处理命令return next.execute(command);}}
/** * 拦截器实现B */import org.activiti.engine.impl.interceptor.Command;import org.activiti.engine.impl.interceptor.CommandInterceptor;public class InterceptorB extends CommandInterceptor {@Overridepublic <T> T execute(Command<T> command) {//输入字符串和命令System.out.println("this is InterceptorB----->"+command.getClass().getName());//然后让职责链中的下一个请求处理者处理命令return next.execute(command);}}
配置类:
/** * 自定义配置类 */import java.util.ArrayList;import java.util.Collection;import java.util.List;import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;import org.activiti.engine.impl.interceptor.CommandContextInterceptor;import org.activiti.engine.impl.interceptor.CommandInterceptor;public class TestConfiguration extends ProcessEngineConfigurationImpl {@Overrideprotected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequired() {//创建一个拦截器结合List<CommandInterceptor> defaultCommandInterceptorsTxRequired=new ArrayList<CommandInterceptor>();//添加自定义拦截器AdefaultCommandInterceptorsTxRequired.add(new InterceptorA());//添加系统的拦截器defaultCommandInterceptorsTxRequired.add(new CommandContextInterceptor(commandContextFactory,this)); return defaultCommandInterceptorsTxRequired;}@Overrideprotected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequiresNew() {//创建一个拦截器集合List<CommandInterceptor> defaultCommandInterceptorsTxRequired=new ArrayList<CommandInterceptor>();//添加自定义拦截器defaultCommandInterceptorsTxRequired.add(new InterceptorB());return defaultCommandInterceptorsTxRequired;}}
测试类:
// 创建流程引擎 ProcessEngines.getDefaultProcessEngine();//创建Activiti配置对象ProcessEngineConfiguration config=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("my-config.xml");ProcessEngine engine =config.buildProcessEngine();// 得到流程存储服务组件RepositoryService repositoryService = engine.getRepositoryService();// 部署流程文件repositoryService.createDeployment().addClasspathResource("bpmn/First.bpmn").deploy();//开始流程engine.getRuntimeService().startProcessInstanceByKey("myProcess");
执行结果:
从截图中可以看到拦截器输出的相关命令,在流程引擎启动时,执行SchemaOperationsProcessEngineBuild,该类也是一个Command的实现,进行部署时,将会执行DeployCmd,获取ID块时,获取GetNextIdblockCmd,开始流程时,执行StartProcessInstanceCmd.
自定拦截器的类图:
这是我对activiti中拦截器的理解,如果您有不同的理解,欢迎交流.
0 0
- 【工作流前进之路】Activiti 研究之拦截器
- 【工作流前进之路】Activiti 权限之用户组-数据查询
- 【工作流前进之路】Activiti 权限之用户管理
- 【工作流前进之路】Activiti第一步:介绍+实例
- 【工作流前进之路】Activiti数据查询排序
- 【工作流前进之路】Activiti 权限之处理用户组和用户关系
- Activiti之命令拦截器
- Activiti工作流之应用
- activiti工作流之初识
- Activiti工作流之准备Activiti开发环境
- Activiti工作流之初识BPMN
- Activiti工作流之用户任务分配
- Activiti工作流之异常处理一
- Activiti工作流(一)之基本操作介绍
- (4)activiti工作流引擎之uel表达式
- Activiti工作流之基础概念介绍
- Activiti工作流之项目中的使用
- activiti工作流退回问题研究
- Redis源码解析(三):redis之数据类型String
- JVM运行时数据区划分
- N皇后问题(递归)
- to kyeremal
- HTTP协议之请求
- 【工作流前进之路】Activiti 研究之拦截器
- div css float浮动用法(left right)
- 浅析Android中的消息机制
- Shiny的架构浅析
- OC的运行时关联,可以类似于为分类添加属性.
- HTTP协议之响应
- android开机自启动的后台Service的实现
- 待我代码编完,娶你可否(二)
- 利用Opencv进行图像灰度变换处理