工作流Activit介绍与应用.doc_第1页
工作流Activit介绍与应用.doc_第2页
工作流Activit介绍与应用.doc_第3页
工作流Activit介绍与应用.doc_第4页
工作流Activit介绍与应用.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

工作流Activiti介绍与应用工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化。1 Activiti简介Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。1.1 Activiti基础编程框架Activiti的基础编程框架如下:Activiti基于Spring,ibatis等开源中间件作为软件平台,在此之上构建了非常清晰的开发框架。上图列出了Activiti的核心组件。1.ProcessEngine:流程引擎的抽象,对于开发者来说,它是我们使用Activiti的外观(faade),通过它可以获得我们需要的一切服务。2.XXService(TaskService,RuntimeService,RepositoryService.):Activiti按照流程的生命周期(定义,部署,运行)把不同阶段的服务封装在不同的Service中,用户可以非常清晰地使用特定阶段的接口。通过ProcessEngine能够获得这些Service实例。1.2 Activiti重要服务类ProcessEngine:流程引擎的抽象,通过它我们可以获得我们需要的一切服务。RepositoryService: Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如BPMN2.0 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。RepositoryService提供了对 repository的存取服务。TaskService:在Activiti业务流程定义中每一个执行节点都被称作一个Task,流程运行过程中,与每个任务节点相关的接口,比如complete, delete,delegate等等都是TaskService提供的。IdentityService: Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。IdentityService提供了对Activiti 系统中的用户和组的管理功能。FormService:Activiti中的流程和Task状态均可关联业务相关的数据。通过FormService可以存取启动和完成任务所需要的表单数据。RuntimeService:在Activiti中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。RuntimeService提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。.ManagementService: ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。HistoryService: HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。关于ProcessEngine和XXService的关系,可以看下面这张图:2 Activiti深入2.1 Activiti配置类分析ProcessEngineConfiguration类的结构图如下图:正如上图所示,ProcessEngineConfiguration是全部配置类的父类,有一个ProcessEngineConfigurationImpl子类,ProcessEngineConfigurationImpl下面有三个直接的子类,其中ProcessEngineConfiguration和ProcessEngineConfigurationImpl都是抽象类。这个类是我们编程时第一个使用的类,有了这个类的层级结构,我们就比较容易理解通过该类获取各种具体实现的ProcessEngineConfiguration类的实例了。ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(activiti.cfg.xml);ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();通过上面的方法,可以获取流程引擎的配置类的实例,这些实例有的是通过配置文件进行配置的,有的则是通过程序的方法进行指定,比如:ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();生成这样的配置实例后,需要对该实例进行数据库连接相关的配置等等。2.2 Activiti命令执行器分析ACTIVITI 所有执行过程都是采用命令模式,使用命令执行器进行执行,这个可是从RuntimeServiceImpl启动流程的代码可以看出来:public ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey) return commandExecutor.execute(new StartProcessInstanceCmd(processDefinitionKey, null, businessKey, null);为了了解命令执行commandExecutor,特分如下几节来说明它的构造,传递,以及命令执行执行的过车过你。2.2.1 命令执行器的构造命令执行器是一个采用拦截器链式的结构,这个可以从如下的分析得出:commandExecutor对象是首先在ProcessEngineConfigurationImpl的初始化方法中产生: protected void initCommandExecutor() if (commandExecutor=null) CommandInterceptor first = initInterceptorChain(commandInterceptors); commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first); 而这个命令执行器commandExecutor的构造过程中跟commandInterceptors中的第一个命令拦截器有关,而commandInterceptors是命令拦截器的列表。protected void initCommandInterceptors() if (commandInterceptors=null) commandInterceptors = new ArrayList(); if (customPreCommandInterceptors!=null) commandInterceptors.addAll(customPreCommandInterceptors); commandInterceptors.addAll(getDefaultCommandInterceptors(); if (customPostCommandInterceptors!=null) commandInterceptors.addAll(customPostCommandInterceptors); commandInterceptors.add(commandInvoker); protected Collection getDefaultCommandInterceptors() List interceptors = new ArrayList(); interceptors.add(new LogInterceptor(); CommandInterceptor transactionInterceptor = createTransactionInterceptor(); if (transactionInterceptor != null) interceptors.add(transactionInterceptor); interceptors.add(new CommandContextInterceptor(commandContextFactory, this); return interceptors; 同时每个拦截器又是通过next域的方式将不同的拦截器进行链接形成一个链接结构,这个可以从initInterceptorChain方法可以看出来:protected CommandInterceptor initInterceptorChain(List chain) if (chain=null | chain.isEmpty() throw new ActivitiException(invalid command interceptor chain configuration: +chain); for (int i = 0; i chain.size()-1; i+) chain.get(i).setNext( chain.get(i+1) ); return chain.get(0); 2.2.2 命令执行器的传递命令执行器commandExecutor对象在ProcessEngineConfigurationImpl的初始化方法中生成,那么为什么它会在RuntimeService等service对象中获取呢?依然回到ProcessEngineConfigurationImpl初始化过程,初始化过程会调用initServices方法,将runtimeService等Service实例与该命令执行体commandExecutor进行绑定。protected void initServices() initService(repositoryService); initService(runtimeService); initService(historyService); initService(identityService); initService(taskService); initService(formService); initService(managementService); initService(dynamicBpmnService); protected void initService(Object service) if (service instanceof ServiceImpl) (ServiceImpl)service).setCommandExecutor(commandExecutor); protected void initService(Object service) if (service instanceof ServiceImpl) (ServiceImpl)service).setCommandExecutor(commandExecutor); 2.2.3 命令执行器执行命令过程 这个可以从CommandExecutor的具体实现类CommandExecutorImpl的execute方法进行分析:public T execute(Command command) return execute(defaultConfig, command); public T execute(CommandConfig config, Command command) return first.execute(config, command); 从中可以看出其实是将命令的处理交给命令拦截器first去处理其中这个first就是LogInterceptor对象的引用,它执行的逻辑如下:public T execute(CommandConfig config, Command command) if (!log.isDebugEnabled() / do nothing here if we cannot log return next.execute(config, command); log.debug(n); log.debug(- starting -, command.getClass().getSimpleName(); try return next.execute(config, command); finally log.debug(- finished -, command.getClass().getSimpleName(); log.debug(n); CommandContextInterceptor顾名思义,它是一个拦截器,拦截所有命令,在命令执行前后执行一些公共性操作。比如CommandContextInterceptor的核心方法:Java代码1. publicTexecute(Commandcommand)2. CommandContextcontext=commandContextFactory.createCommandContext(command);3. 4. try5. /执行前保存上下文6. Context.setCommandContext(context);7. Context.setProcessEngineConfiguration(processEngineConfiguration);8. returnnext.execute(command);/执行命令9. 10. catch(Exceptione)11. context.exception(e);12. finally13. try14. /关闭上下文,内部会flushsession,把数据持久化到db等15. context.close();16. finally17. /释放上下文18. Context.removeCommandContext();19. Context.removeProcessEngineConfiguration();20. 21. 22. 23. returnnull;24. LogInterceptor对象主要是打印一下日志,最后执行next.execute(config, command); 将命令交给下一个拦截器处理,依次类推。这种将命令依次交给一条链表中的不同节点的执行体执行的设计模式就是责任链模式。最后一个拦截器CommandInvoker的处理逻辑如下:public T execute(CommandConfig config, Command command) return command.execute(Context.getCommandContext();上面Service中定义的各个方法都对应相应的命令对象(xxCmd), Service把各种请求委托给xxCmd,xxCmd来决定命令的接收者,接收者执行后返回结果。比如processEngineConfiguration.buildProcessEngine()操作=命令:SchemaOperationsProcessEngineBuild。runtimeService.startProcessInstanceByKey()启动流程操作=命令:StartProcessInstanceCmd2.3 Activiti重要表结构描述2.3.1 逻辑结构设计Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。1)ACT_RE_*: RE表示repository。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。2)ACT_RU_*: RU表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 3)ACT_ID_*: ID表示identity。这些表包含身份信息,比如用户,组等等。ACT_HI_*: HI表示history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。 4) ACT_HI_*: HI表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。5)ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件2.3.2 资源库流程规则表 部署信息表( act_re_deployment) 1)简要描述部署流程定义时需要被持久化保存下来的信息。2)表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)主键IDNAME_部署名称nvarchar(255)CATEGORY_分类nvarchar(255)类别DEPLOY_TIME_部署时间datetime部署时间 流程设计模型部署表( act_re_model )1)简要描述 流程设计器设计流程后,保存数据到该表 2)表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_REV_乐观锁int乐观锁NAME_名称nvarchar(255)名称KEY_KEY_nvarchar(255)分类,例如: CATEGORY_分类nvarchar(255)分类CREATE_TIME_创建时间datetime创建时间LAST_UPDATE_TIME_最新修改时间datetime最新修改时间VERSION_版本int版本META_INFO_META_INFO_nvarchar(255)以json格式保存流程定义的信息DEPLOYMENT_ID_部署IDnvarchar(255)部署IDEDITOR_SOURCE_VALUE_ID_datetimeEDITOR_SOURCE_EXTRA_VALUE_ID_datetime 流程定义数据表( act_re_procdef )1)简要描述业务流程定义数据表。此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME与ACT_RE_PROCDEF.NAME_完成的,在数据库表结构中没有体现。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_REV_乐观锁int乐观锁CATEGORY_分类nvarchar(255)流程定义的Namespace就是类别NAME_名称nvarchar(255)名称KEY_定义的KEYnvarchar(255)流程定义IDVERSION_版本int版本DEPLOYMENT_ID_部署表IDnvarchar(64)部署表IDRESOURCE_NAME_bpmn文件名称nvarchar(4000)流程bpmn文件名称DGRM_RESOURCE_NAME_png图片名称nvarchar(4000)流程图片名称DESCRIPTION_描述nvarchar(4000)描述HAS_START_FORM_KEY_是否存在开始节点formKeytinyintstart节点是否存在formKey0否 1是2.3.3 运行时数据库表 运行时流程执行实例表( act_ru_execution )1)简要描述流程执行记录表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_REV_乐观锁int乐观锁PROC_INST_ID_流程实例IDnvarchar(64)流程实例IDBUSINESS_KEY_业务主键IDnvarchar(255)业务主键IDPARENT_ID_父节点实例IDnvarchar(64)父节点实例IDPROC_DEF_ID_流程定义IDnvarchar(64)流程定义IDSUPER_EXEC_SUPER_EXEC_nvarchar(64)SUPER_EXEC_ACT_ID_节点实例IDnvarchar(255)节点实例ID即ACT_HI_ACTINST中IDIS_ACTIVE_是否存活tinyint是否存活IS_CONCURRENT_是否并行tinyint是否为并行(true/false)IS_SCOPE_IS_SCOPE_tinyintIS_SCOPE_IS_EVENT_SCOPE_IS_EVENT_SCOPE_tinyintIS_EVENT_SCOPE_SUSPENSION_STATE_是否挂起tinyint挂起状态 1激活 2挂起CACHED_ENT_STATE_int 运行时流程人员表( act_ru_identitylink )1)简要描述任务参与者数据表。主要存储当前节点参与者的信息。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_REV_乐观锁int乐观锁GROUP_ID_组IDnvarchar(64)组IDTYPE_类型nvarchar(255)备注7USER_ID_用户IDnvarchar(64)用户IDTASK_ID_节点实例IDnvarchar(64)节点实例IDPROC_INST_ID_流程实例IDnvarchar(64)流程实例ID 运行时任务节点表( act_ru_task )1)简要描述运行时任务数据表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_REV_乐观锁int乐观锁EXECUTION_ID_执行实例IDnvarchar(64)执行实例IDPROC_INST_ID_流程实例IDnvarchar(64)流程实例IDPROC_DEF_ID_流程定义IDnvarchar(64)流程定义IDNAME_节点定义名称nvarchar(255)节点定义名称PARENT_TASK_ID_父节点实例IDnvarchar(64)父节点实例IDDESCRIPTION_节点定义描述nvarchar(4000)节点定义描述TASK_DEF_KEY_节点定义的KEYnvarchar(255)任务定义的IDOWNER_实际签收人nvarchar(255)拥有者(一般情况下为空,只有在委托时才有值)ASSIGNEE_签收人或委托人nvarchar(255)签收人或委托人DELEGATION_委托类型nvarchar(64)备注8PRIORITY_优先级别int优先级别,默认为:50CREATE_TIME_创建时间datetime创建时间DUE_DATE_过期时间datetime耗时SUSPENSION_STATE_是否挂起int1代表激活 2代表挂起 运行时流程变量数据表( act_ru_variable )1)简要描述运行时流程变量数据表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)主键标识REV_乐观锁int乐观锁TYPE_类型nvarchar(255)备注9NAME_名称nvarchar(255)变量名称EXECUTION_ID_执行实例IDnvarchar(64)执行的IDPROC_INST_ID_流程实例IDnvarchar(64)流程实例IDTASK_ID_节点实例IDnvarchar(64)节点实例ID(Local)BYTEARRAY_ID_字节表IDnvarchar(64)字节表的ID(ACT_GE_BYTEARRAY)DOUBLE_DOUBLE_float存储变量类型为DoubleLONG_LONG_numeric(19)存储变量类型为longTEXT_TEXT_nvarchar(4000)存储变量值类型为String 如此处存储持久化对象时,值jpa对象的classTEXT2_TEXT2_nvarchar(4000)此处存储的是JPA持久化对象时,才会有值。此值为对象ID 运行时定时任务数据表(act_ru_job )1)简要描述运行时定时任务数据表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_标识nvarchar(64)标识REV_版本int版本TYPE_类型nvarchar(255)类型LOCK_EXP_TIME_锁定释放时间datetime锁定释放时间LOCK_OWNER_挂起者nvarchar(255)挂起者EXCLUSIVE_bitEXECUTION_ID_执行实例IDnvarchar(64)执行实例IDPROCESS_INSTANCE_ID_流程实例IDnvarchar(64)流程实例IDPROC_DEF_ID_流程定义IDnvarchar(64)流程定义IDRETRIES_intEXCEPTION_STACK_ID_异常信息IDnvarchar(64)异常信息IDEXCEPTION_MSG_异常信息nvarchar(4000)异常信息DUEDATE_到期时间datetime到期时间REPEAT_重复nvarchar(255)重复HANDLER_TYPE_处理类型nvarchar(255)处理类型HANDLER_CFG_nvarchar(4000)标识2.3.4 历史数据库表 历史节点表(act_hi_actinst)1)简要描述历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)PROC_DEF_ID_流程定义IDnvarchar(64)PROC_INST_ID_流程实例IDnvarchar(64)EXECUTION_ID_执行实例IDnvarchar(64)ACT_ID_节点IDnvarchar(225)节点定义IDTASK_ID_任务实例IDnvarchar(64)任务实例ID 其他节点类型实例ID在这里为空CALL_PROC_INST_ID_调用外部的流程实例IDnvarchar(64)调用外部流程的流程实例IDACT_NAME_节点名称nvarchar(225)节点定义名称ACT_TYPE_节点类型nvarchar(225)如startEvent、userTaskASSIGNEE_签收人nvarchar(64)节点签收人START_TIME_开始时间datetime2013-09-15 11:30:00END_TIME_结束时间datetime2013-09-15 11:30:00DURATION_耗时numeric(19,0)毫秒值 历史任务实例表( act_hi_taskinst ) 1)简要描述历史任务实例表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)主键IDPROC_DEF_ID_流程定义IDnvarchar(64)流程定义IDTASK_DEF_KEY_节点定义IDnvarchar(255)节点定义IDPROC_INST_ID_流程实例IDnvarchar(64)流程实例IDEXECUTION_ID_执行实例IDnvarchar(64)执行实例IDNAME_名称varchar(255)名称PARENT_TASK_ID_父节点实例IDnvarchar(64)父节点实例IDDESCRIPTION_描述nvarchar(400)描述OWNER_实际签收人 任务的拥有者nvarchar(255)签收人(默认为空,只有在委托时才有值)ASSIGNEE_签收人或被委托nvarchar(255)签收人或被委托START_TIME_开始时间datetime开始时间CLAIM_TIME_提醒时间datetime提醒时间END_TIME_结束时间datetime结束时间DURATION_耗时numeric(19)耗时DELETE_REASON_删除原因nvarchar(4000)删除原因(completed,deleted)PRIORITY_优先级别int优先级别DUE_DATE_过期时间datetime过期时间,表明任务应在多长时间内完成FORM_KEY_ 历史变量表( act_hi_varinst )1)简要描述历史变量表。2) 表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)ID_PROC_INST_ID_流程实例IDnvarchar(64)流程实例IDEXECUTION_ID_执行实例IDnvarchar(255)执行实例IDTASK_ID_任务实例IDnvarchar(64)任务实例IDNAME_名称nvarchar(64)参数名称(英文)VAR_TYPE_参数类型varchar(255)备注5REV_乐观锁nvarchar(64)乐观锁 VersionBYTEARRAY_ID_字节表IDnvarchar(400)ACT_GE_BYTEARRAY表的主键DOUBLE_DOUBLE_nvarchar(255)存储DoubleType类型的数据LONG_LONG_nvarchar(255)存储LongType类型的数据TEXT_TEXT_datetime备注6TEXT2_TEXT2_datetime此处存储的是JPA持久化对象时,才会有值。此值为对象ID2.3.5 通用数据表 二进制数据表(act_ge_bytearray)1)简要描述保存流程定义图片和bpmn文件,即保存所有二进制数据。2)表结构说明字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)主键IDREV_乐观锁intVersion(版本)NAME_名称nvarchar(255)部署的文件名称,如:mail.bpmn、mail.png 、mail.bpmn20.xmlDEPLOYMENT_ID_部署IDnvarchar(64)部署表IDBYTES_字节varbinary(max)部署文件GENERATED_是否是引擎生成tinyint0为用户生成 1为Activiti生成3 开发前准备3.1 下载Activiti下载的官方网站的地址:/download.html。下载后解压(我所使用的是activiti-5.21.0版本的),看到如下目录:1) database:里面存放的是Activiti使用到的数据库信息的sql文件,它支持主流的数据库类型,使用时只需执行你自己的数据库类型的文件即可。如:你的数据库是MySQL,那么就执行activiti.mysql.create.*.sql即可。2) docs:毫无疑问,api文档是也。3) libs:使用Activiti所需要的所有的jar包和源文件。4) wars:官方给我们提供的示例Demo,通过使用Demo可以更加快速的了解Activiti。3.2 下载安装流程设计器(eclipse插件)下载activiti-designer-5.18.0.zip工作流设计插件,在eclipse安装该插件,安装后,我们可以在eclipse里面很方便的设计出流程图。安装完成后在菜单选项中会出现activiti的目录选项设置eclipse activit插件的画流程图选项,打开菜单Windows - Preferences - Activiti -Save Actions 下,设置流程图片的生成方式:4 入门示例4.1 创建Maven项目在eclipse左边工作栏右键New选择创建Maven Project项目,创建一个名为ActivitiTest的项目然后在pom.xml文件中添加以下依赖 org.activitiactiviti-engine5.21.0org.activitiactiviti-spring5.21.0org.codehaus.groovygroovy-all2.4.3org.slf4jslf4j-api1.7.6or

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论