1Activiti服务架构1。1概述 1。2activiticfg。xmlactiviticfg。xml是activiti的引擎配置文件,包括:ProcessEngineConfiguration的定义、数据源的定义、事务管理器等,此文件其实就是一个Spring配置文件,下面是一个基本的配置只配置了ProcessEngineConfiguration和数据源。lt;?xmlversion1。0encodingUTF8?beansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:contexthttp:www。springframework。orgschemacontextxmlnshttp:www。springframework。orgschemabeansxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsdhttp:www。springframework。orgschemacontexthttp:www。springframework。orgschemacontextspringcontext。xsd!配置数据源beaniddataSourceclassorg。apache。commons。dbcp。BasicDataSourcepropertynamedriverClassNamevaluecom。mysql。cj。jdbc。Driverpropertynameusernamevaluerootpropertynameurlvaluejdbc:mysql:192。168。134。100:3306activiti?useUnicodetruecharacterEncodingUTF8autoReconnecttrueuseSSLfalseserverTimezoneGMT2B8allowPublicKeyRetrievaltruepropertynamepasswordvalue123456propertynamemaxActivevalue3propertynamemaxIdlevalue1bean!Activiti单独运行的ProcessEngine配置beanidprocessEngineConfigurationclassorg。activiti。engine。impl。cfg。StandaloneProcessEngineConfiguration!数据源propertynamedataSourcerefdataSource!activiti数据库表处理策略false(默认值):检查数据库的版本和依赖库的版本,如果不匹配就抛出异常true:构建流程引擎时,执行检查,如果需要就执行更新。如果表不存在,就创建。createdrop:构建流程引擎时创建数据库报表,关闭流程引擎时就删除这些表。dropcreate:先删除表再创建表。create:构建流程引擎时创建数据库表,关闭流程引擎时不删除这些表propertynamedatabaseSchemaUpdatevaluetruebeanbeans1。3ProcessEngineConfiguration1。3。1概述流程引擎的配置类,通过ProcessEngineConfiguration可以创建工作流引擎ProcessEngine,常用的两种方法如下:1。3。2StandaloneProcessEngineConfiguration通过org。activiti。engine。impl。cfg。StandaloneProcessEngineConfiguration,Activiti可以单独运行,使用它创建的ProcessEngine,Activiti会自己处理事务。配置文件方式:通常在activiticfg。xml配置文件中定义一个id为processEngineConfiguration的Bean,这里会使用Spring的依赖注入来构建引擎。bean1。3。3SpringProcessEngineConfiguration通过org。activiti。spring。SpringProcessEngineConfiguration和Spring整合。lt;?xmlversion1。0encodingUTF8?beansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:contexthttp:www。springframework。orgschemacontextxmlnshttp:www。springframework。orgschemabeansxmlns:txhttp:www。springframework。orgschematxxmlns:aophttp:www。springframework。orgschemaaopxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsdhttp:www。springframework。orgschemacontexthttp:www。springframework。orgschemacontextspringcontext。xsdhttp:www。springframework。orgschematxhttp:www。springframework。orgschematxspringtx。xsdhttp:www。springframework。orgschemaaophttp:www。springframework。orgschemaaopspringaop。xsd!配置数据源beaniddataSourceclassorg。apache。commons。dbcp。BasicDataSourcepropertynamedriverClassNamevaluecom。mysql。cj。jdbc。Driverpropertynameusernamevaluerootpropertynameurlvaluejdbc:mysql:192。168。134。100:3306activiti?useUnicodetruecharacterEncodingUTF8autoReconnecttrueuseSSLfalseserverTimezoneGMT2B8allowPublicKeyRetrievaltruepropertynamepasswordvalue123456propertynamemaxActivevalue3propertynamemaxIdlevalue1bean!工作流引擎配置beanbeanidprocessEngineConfigurationclassorg。activiti。spring。SpringProcessEngineConfiguration!数据源propertynamedataSourcerefdataSource!使用spring事务管理器propertynametransactionManagerreftransactionManager!数据库策略propertynamedatabaseSchemaUpdatevaluedropcreatebean!流程引擎beanidprocessEngineclassorg。activiti。spring。ProcessEngineFactoryBeanpropertynameprocessEngineConfigurationrefprocessEngineConfigurationbean!资源服务servicebeanidrepositoryServicefactorybeanprocessEnginefactorymethodgetRepositoryService!流程运行servicebeanidruntimeServicefactorybeanprocessEnginefactorymethodgetRuntimeService!任务管理servicebeanidtaskServicefactorybeanprocessEnginefactorymethodgetTaskService!历史管理servicebeanidhistoryServicefactorybeanprocessEnginefactorymethodgetHistoryService!引擎管理servicebeanidmanagementServicefactorybeanprocessEnginefactorymethodgetManagementService!事务管理器beanidtransactionManagerclassorg。springframework。jdbc。datasource。DataSourceTransactionManagerpropertynamedataSourcerefdataSourcebean!通知tx:adviceidtxAdvicetransactionmanagertransactionManagertx:attributes!传播行为tx:methodnamesavepropagationREQUIREDtx:methodnameinsertpropagationREQUIREDtx:methodnamedeletepropagationREQUIREDtx:methodnameupdatepropagationREQUIREDtx:methodnamefindpropagationSUPPORTSreadonlytruetx:methodnamegetpropagationSUPPORTSreadonlytruetx:attributestx:advice!切面,根据具体项目修改切点配置aop:configbeans1。3。4创建ProcessEngineConfiguration下面的方法:要求activiticfg。xml中必须由一个processEngineConfiguration的Bean的id。publicstaticProcessEngineConfigurationcreateProcessEngineConfigurationFromResource(Stringresource){returncreateProcessEngineConfigurationFromResource(resource,processEngineConfiguration);}下面的方法,可以更改Bean的id。publicstaticProcessEngineConfigurationcreateProcessEngineConfigurationFromResource(Stringresource,StringbeanName){returnBeansConfigurationHelper。parseProcessEngineConfigurationFromResource(resource,beanName);}1。4ProcessEngine工作流引擎,相当于一个门面接口,通过ProcessEngineConfiguration创建ProcessEngine,通过ProcessEngine创建各个Service接口。1。4。1一般创建方式示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;authorweiwei。xuversion1。0202007316:41publicclassActivitiTest{publicstaticvoidmain(String〔〕args){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiti。cfg。xml);创建ProcessEngine对象ProcessEngineprocessEngineconfiguration。buildProcessEngine();System。out。println(processEngineprocessEngine);}}1。4。2简单创建方式将activiti。cfg。xml文件名以及路径固定,且activiti。cfg。xml文件中有processEngineConfiguration的配置,那么可以使用如下代码创建ProcessEngine。packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngines;authorweiwei。xuversion1。0202007316:41publicclassActivitiTest{publicstaticvoidmain(String〔〕args){该方法有限制Activiti的配置文件名必须为activiti。cfg。xmlBean的id必须是processEngineConfigurationProcessEngineprocessEngineProcessEngines。getDefaultProcessEngine();System。out。println(processEngineprocessEngine);}}1。5Service1。5。1Service的创建方式通过ProcessEngine创建Service,Service是工作流引擎提供用于进行工作流部署、指定、管理的服务接口。创建方式如下:packagecom。sunxiaping;importorg。activiti。engine。;authorweiwei。xuversion1。02020073111:55publicclassActivitiTest{publicstaticvoidmain(String〔〕args){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);创建ProcessEngine对象ProcessEngineprocessEngineconfiguration。buildProcessEngine();RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();RuntimeServiceruntimeServiceprocessEngine。getRuntimeService();TaskServicetaskServiceprocessEngine。getTaskService();HistoryServicehistoryServiceprocessEngine。getHistoryService();ManagementServicemanagementServiceprocessEngine。getManagementService();System。out。println(repositoryServicerepositoryService);System。out。println(runtimeServiceruntimeService);System。out。println(taskServicetaskService);System。out。println(historyServicehistoryService);System。out。println(managementServicemanagementService);}}1。5。2Service总览 Service接口 说明 RepositoryService Activiti的资源管理接口 RuntimeService Activiti的流程运行管理接口 TaskService Activiti的任务管理接口 HistoryService Activiti的历史管理接口 ManagementService Activiti的引擎管理接口1。5。3RepositoryServiceRepositoryService,是Activiti的资源管理接口,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此Service将流程定义文件的内容部署到计算机中。除了流程部署定义以外还可以做如下的操作:1查询引擎中的发布包和流程定义。2暂停或激活发布包以及对应全部和特定流程定义。暂停意味着它们不能再在执行任务操作了,激活是对应的反向操作。3获取多种资源,像包含在发布包中的文件获引擎自动生成的流程图。4获取流程定义的POJO,可以用解析流程,而不必通过XML。1。5。4RuntimeServiceRuntimeService是Activiti的流程运行管理接口,可以从这个接口中获取很多关于流程执行相关的信息。1。5。5TaskServiceTaskService是Activiti的任务管理接口,可以从这个接口中获取任务的信息。1。5。6HistoryServiceHistoryService是Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会包含很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。1。5。7ManagementServiceManagementService是Activiti的引擎管理接口,提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。2Activiti入门体验2。1流程定义2。1。1画板在IDEA中安装对应的ActivitiDesigner(Activiti设计器)插件即可使用,画板中包括以下结点:Connection连接。Event事件。Task任务。Gateway网关。Container容器。Boundaryevent边界事件。Intermediateevent中间事件。流程图设计完毕保存生成。bpmn文件。本人此时使用的IDEA版本是2020。2,而IDEA中的Activiti设计器插件actiBPM到此时位置已停止更新了。 本人只能使用Eclipse画流程图。Eclipse需要安装Activiti插件,略。2。1。2绘制流程 2。1。3指定流程定义key流程定义key即流程定义的标识。 建议:相同的业务流程,流程定义的key名字定义一样。如果需要创建新的业务流程,则使用新的key。 2。1。4指定任务负责人为每个任务结点指定负责人,如添加请假单的负责人是张三。 2。2部署流程定义将刚才生成的holiday。bpmn和holiday。png拷贝到项目的resources目录下。 示例:使用RepositoryService部署流程定义packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。activiti。engine。repository。Deployment;importorg。junit。Test;authorweiwei。xuversion1。02020073111:55publicclassActivitiDeploymentTest{部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中actredeployment部署信息actreprocdef流程定义的一些信息actgebytearray流程定义bpmn文件和png文件Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();进行部署DeploymentdeploymentrepositoryService。createDeployment()。addClasspathResource(diagramholiday。bpmn)添加bpmn资源。addClasspathResource(diagramholiday。png)。name(请假申请流程)。deploy();部署输出部署的一些信息Stringiddeployment。getId();System。out。println(流程部署idid);Stringnamedeployment。getName();System。out。println(流程部署名称name);}}2。3启动一个流程实例流程定义部署在Activiti中之后就可以通过工作流管理业务流程了。针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于Java类和Java对象的关系,类定义好之后需要new创建一个对象使用,当然,也可以new多个对象。对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,李四发起一个请求申请单也需要启动一个流程实例。关系: 流程定义(BPMN文件)流程部署(Activiti的三张表)。 流程实例启动流程实例。 类比: 流程定义类似于Java中的类,流程实例类似于Java中的一个实例(对象),所以一个流程定义key对应多个不同的流程实例。示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RuntimeService;importorg。activiti。engine。runtime。ProcessInstance;importorg。junit。Test;authorweiwei。xuversion1。02020080114:35publicclassActivitiStartProcessInstanceTest{acthiactinst活动实例acthiidentitylink参与者信息acthiprocinst流程实例acthitaskinst任务实例actruexecution执行表actruidentitylink参与者信息actrutask任务表Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RuntimeService对象RuntimeServiceruntimeServiceprocessEngine。getRuntimeService();根据流程定义的key启动流程实例ProcessInstanceprocessInstanceruntimeService。startProcessInstanceByKey(holiday);获取流程实例的相关信息StringprocessDefinitionIdprocessInstance。getProcessDefinitionId();System。out。println(流程定义的idprocessDefinitionId);StringdeploymentIdprocessInstance。getDeploymentId();System。out。println(流程部署的iddeploymentId);StringidprocessInstance。getId();System。out。println(流程实例的idid);StringactivityIdprocessInstance。getActivityId();System。out。println(当前活动的idactivityId);}}2。4任务查询流程启动后,各个任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。TaskService;importorg。activiti。engine。task。Task;importorg。junit。Test;importjava。util。List;authorweiwei。xuversion1。02020080115:00publicclassActivitiTaskTest{actrutaskTestpublicvoidtest(){任务负责人Stringassignee张三;创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取TaskService对象TaskServicetaskServiceprocessEngine。getTaskService();查询任务列表,根据流程定义的key和任务负责人ListTasktaskListtaskService。createTaskQuery()。processDefinitionKey(holiday)。taskAssignee(assignee)。list();遍历任务列表for(Tasktask:taskList){StringprocessDefinitionIdtask。getProcessDefinitionId();System。out。println(流程定义idprocessDefinitionId);StringprocessInstanceIdtask。getProcessInstanceId();System。out。println(流程实例idprocessInstanceId);Stringassignee1task。getAssignee();System。out。println(任务负责人assignee1);Stringidtask。getId();System。out。println(任务idid);Stringnametask。getName();System。out。println(任务名称name);}}}2。5任务处理任务负责人查询待办任务,选择任务进行处理,完成任务。示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。TaskService;importorg。activiti。engine。task。Task;importorg。junit。Test;importjava。util。List;authorweiwei。xuversion1。02020080115:20publicclassActivitiTaskCompleteTest{acthiactinst活动实例acthiidentitylink参与者信息acthitaskinst任务实例actruexecution执行表actruidentitylink参与者信息actrutask任务表Testpublicvoidtest(){任务负责人Stringassignee张三;创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取TaskService对象TaskServicetaskServiceprocessEngine。getTaskService();查询任务列表,根据流程定义的key和任务负责人ListTasktaskListtaskService。createTaskQuery()。processDefinitionKey(holiday)。taskAssignee(assignee)。list();遍历任务列表for(Tasktask:taskList){Stringidtask。getId();完成任务taskService。complete(id);}}}3流程定义3。1流程定义概述3。1。1什么是流程定义?流程定义是按照BPMN2。0标准去描述业务流程,通常使用Activitiexplorer(Activiti控制台)或Activitieclipsedesigner(Activiti的eclipse设计器)插件对业务流程进行建模,这两种方式都遵循BPMN2。0标准。如果使用Activitieclipsedesigner插件完成业务流程建模。可以生成两个文件:。bpmn和。png文件。3。1。2bpmn文件。bpmn文件其实就是XML文件。definitionsxmlnshttp:www。omg。orgspecBPMN20100524MODELxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:xsdhttp:www。w3。org2001XMLSchemaxmlns:activitihttp:activiti。orgbpmnxmlns:bpmndihttp:www。omg。orgspecBPMN20100524DIxmlns:omgdchttp:www。omg。orgspecDD20100524DCxmlns:omgdihttp:www。omg。orgspecDD20100524DItypeLanguagehttp:www。w3。org2001XMLSchemaexpressionLanguagehttp:www。w3。org1999XPathtargetNamespacehttp:www。activiti。orgtestprocessidholidayname请假申请流程isExecutabletruestartEventidstartevent2name开始userTaskidusertask1name填写请假申请单activiti:assignee张三sequenceFlowidflow1sourceRefstartevent2targetRefusertask1userTaskidusertask2name部门经理审批activiti:assignee李四sequenceFlowidflow2sourceRefusertask1targetRefusertask2userTaskidusertask3name总经理审批activiti:assignee王五sequenceFlowidflow3sourceRefusertask2targetRefusertask3endEventidendevent1name结束sequenceFlowidflow4sourceRefusertask3targetRefendevent1processbpmndi:BPMNDiagramidBPMNDiagramholidaybpmndi:BPMNPlanebpmnElementholidayidBPMNPlaneholidaybpmndi:BPMNShapebpmnElementstartevent2idBPMNShapestartevent2omgdc:Boundsheight35。0width35。0x100。0y160。0bpmndi:BPMNShapebpmndi:BPMNShapebpmnElementusertask1idBPMNShapeusertask1omgdc:Boundsheight55。0width105。0x180。0y150。0bpmndi:BPMNShapebpmndi:BPMNShapebpmnElementusertask2idBPMNShapeusertask2omgdc:Boundsheight55。0width105。0x330。0y150。0bpmndi:BPMNShapebpmndi:BPMNShapebpmnElementusertask3idBPMNShapeusertask3omgdc:Boundsheight55。0width105。0x480。0y150。0bpmndi:BPMNShapebpmndi:BPMNShapebpmnElementendevent1idBPMNShapeendevent1omgdc:Boundsheight35。0width35。0x630。0y160。0bpmndi:BPMNShapebpmndi:BPMNEdgebpmnElementflow1idBPMNEdgeflow1omgdi:waypointx135。0y177。0omgdi:waypointx180。0y177。0bpmndi:BPMNEdgebpmndi:BPMNEdgebpmnElementflow2idBPMNEdgeflow2omgdi:waypointx285。0y177。0omgdi:waypointx330。0y177。0bpmndi:BPMNEdgebpmndi:BPMNEdgebpmnElementflow3idBPMNEdgeflow3omgdi:waypointx435。0y177。0omgdi:waypointx480。0y177。0bpmndi:BPMNEdgebpmndi:BPMNEdgebpmnElementflow4idBPMNEdgeflow4omgdi:waypointx585。0y177。0omgdi:waypointx630。0y177。0bpmndi:BPMNEdgebpmndi:BPMNPlanebpmndi:BPMNDiagramdefinitions。bpmn文件的根节点是definitions节点。这个元素中,可以定义多个流程定义(建议每个文件只包含一个流程定义,可以简化开发过程中的维护难度)。注意,definitions元素最少也要包含xmlns和targetNamespace的声明。targetNamespace可以是任何值,它用来对流程实例进行分类。流程定义部分:定义了流程每个结点的描述和结点之间的流程流转。流程布局定义:定义流程每个结点在流程图上的位置坐标等信息。3。1。3png图片文件如果是在Eclipse中,需要进行如下的配置: 3。2流程定义部署3。2。1什么是流程定义部署将生成的流程定义部署到Activiti的数据库中,这就是流程定义部署,通过调用Activiti的API将流程定义的bpmn和png两个文件一个一个添加部署到Activiti中,也可以将两个文件打成zip包进行部署。3。2。2单个文件部署方式分别将bpmn文件和png图片文件部署。示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。activiti。engine。repository。Deployment;importorg。junit。Test;authorweiwei。xuversion1。02020073111:55publicclassActivitiDeploymentTest{部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中actredeployment部署信息actreprocdef流程定义的一些信息actgebytearray流程定义bpmn文件和png文件Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();进行部署DeploymentdeploymentrepositoryService。createDeployment()。addClasspathResource(diagramholiday。bpmn)添加bpmn资源。addClasspathResource(diagramholiday。png)。name(请假申请流程)。deploy();部署输出部署的一些信息Stringiddeployment。getId();System。out。println(流程部署idid);Stringnamedeployment。getName();System。out。println(流程部署名称name);}}3。2。3压缩包部署方式将。bpmn文件和。png图片压缩成一个zip包。 示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。activiti。engine。repository。Deployment;importorg。junit。Test;importjava。io。InputStream;importjava。util。zip。ZipInputStream;authorweiwei。xuversion1。02020073111:55publicclassActivitiZipDeploymentTest{部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中actredeployment部署信息actreprocdef流程定义的一些信息actgebytearray流程定义bpmn文件和png文件Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();InputStreaminputStreamthis。getClass()。getClassLoader()。getResourceAsStream(diagramholiday。zip);ZipInputStreamzipInputStreamnewZipInputStream(inputStream);进行部署DeploymentdeploymentrepositoryService。createDeployment()。addZipInputStream(zipInputStream)。name(请假申请流程)。deploy();部署输出部署的一些信息Stringiddeployment。getId();System。out。println(流程部署idid);Stringnamedeployment。getName();System。out。println(流程部署名称name);}}3。2。4操作数据表流程定义部署后,会操作三张表:actredeployment、actreprocdef和actgebytearray。actredeployment是流程定义部署表,记录流程部署信息。actreprocdef是流程定义表,记录流程定义信息。actgebytearray是资源表,将。bpmn文件和。png图片存入到这个表。说明: actredeployment和actreprocdef是一对多的关系,一次部署在流程部署表生成一条记录,但一次流程部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在actgebytearray会存在两个资源记录。bpmn文件和。png图片。 建议: 一次部署一个流程,这样部署表和流程定义表示一对一的关系,方便读取流程部署和流程定义信息。3。3流程定义查询示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。activiti。engine。repository。ProcessDefinition;importorg。activiti。engine。repository。ProcessDefinitionQuery;importorg。junit。Test;importjava。util。List;authorweiwei。xuversion1。02020080121:24publicclassActivitiProcessDefinitionQueryTest{查询流程定义信息Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();得到ProcessDefinitionQuery对象ProcessDefinitionQueryprocessDefinitionQueryrepositoryService。createProcessDefinitionQuery();设置条件,并查询出当前的所有流程定义ListProcessDefinitionprocessDefinitionListprocessDefinitionQuery。processDefinitionKey(holiday)。orderByProcessDefinitionVersion()。desc()。list();输出流程定义信息for(ProcessDefinitionprocessDefinition:processDefinitionList){System。out。println(流程定义的idprocessDefinition。getId());System。out。println(流程定义的nameprocessDefinition。getName());System。out。println(流程定义的keyprocessDefinition。getKey());System。out。println(流程定义的versionprocessDefinition。getVersion());}}}3。4流程定义删除示例:packagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。junit。Test;authorweiwei。xuversion1。02020080121:13publicclassActivitiDeleteProcessDefinitionTest{删除已经部署的流程定义注意事项:当我们正在执行的这一套流程没有结束,此时如果要删除流程定义信息就会失败(调用voiddeleteDeployment(StringdeploymentId)方法)。当我们正在执行的这一套流程没有结束,此时如果要强制删除流程定义信息,需要调用voiddeleteDeployment(StringdeploymentId,booleancascade)这个方式,将cascade设置为true。Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();删除已经部署的流程定义StringdeploymentId1;repositoryService。deleteDeployment(deploymentId);}}3。5流程定义资源查询示例:通过查询流程定义对象获取流程定义资源,即bpmn和pngpackagecom。sunxiaping;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。RepositoryService;importorg。activiti。engine。repository。ProcessDefinition;importorg。activiti。engine。repository。ProcessDefinitionQuery;importorg。junit。Test;importorg。springframework。util。FileCopyUtils;importjava。io。File;importjava。io。FileOutputStream;importjava。io。IOException;importjava。io。InputStream;importjava。util。List;authorweiwei。xuversion1。02020080210:22publicclassActivitiResourceTest{Testpublicvoidtest()throwsIOException{创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取RepositoryService对象RepositoryServicerepositoryServiceprocessEngine。getRepositoryService();获取ProcessDefinitionQuery对象ProcessDefinitionQueryprocessDefinitionQueryrepositoryService。createProcessDefinitionQuery();设置查询条件,执行查询操作ListProcessDefinitionprocessDefinitionListprocessDefinitionQuery。processDefinitionKey(holiday)。orderByProcessDefinitionVersion()。desc()。list();遍历查询结果for(ProcessDefinitionprocessDefinition:processDefinitionList){获取资源名称,即png图片的名称StringresourceNameprocessDefinition。getResourceName();获取图表资源,即bpmn图片的名称StringdiagramResourceNameprocessDefinition。getDiagramResourceName();获取资源的输入流,即png图片的输入流InputStreamresourceNameInputStreamrepositoryService。getResourceAsStream(processDefinition。getDeploymentId(),resourceName);InputStreamdiagramResourceNameInputStreamrepositoryService。getResourceAsStream(processDefinition。getDeploymentId(),diagramResourceName);StringresourcePathd:File。separatorresourceName;FilefilenewFile(resourcePath);if(!file。exists()){file。getParentFile()。mkdirs();}StringdiagramResourcePathd:File。separatordiagramResourceName;filenewFile(diagramResourcePath);if(!file。exists()){file。getParentFile()。mkdirs();}复制文件FileCopyUtils。copy(resourceNameInputStream,newFileOutputStream(resourcePath));FileCopyUtils。copy(diagramResourceNameInputStream,newFileOutputStream(diagramResourcePath));}}}3。6流程历史信息查询示例:packagecom。sunxiaping;importorg。activiti。engine。HistoryService;importorg。activiti。engine。ProcessEngine;importorg。activiti。engine。ProcessEngineConfiguration;importorg。activiti。engine。history。HistoricActivityInstance;importorg。activiti。engine。history。HistoricActivityInstanceQuery;importorg。junit。Test;importjava。util。List;authorweiwei。xuversion1。02020080121:13publicclassActivitiHistoryTest{Testpublicvoidtest(){创建ProcessEngineConfiguration对象ProcessEngineConfigurationconfigurationProcessEngineConfiguration。createProcessEngineConfigurationFromResource(activiticfg。xml);获取ProcessEngine对象ProcessEngineprocessEngineconfiguration。buildProcessEngine();获取HistoryService对象HistoryServicehistoryServiceprocessEngine。getHistoryService();获取HistoricActivityInstanceQuery查询对象HistoricActivityInstanceQueryhistoricActivityInstanceQueryhistoryService。createHistoricActivityInstanceQuery();ListHistoricActivityInstancehistoricActivityInstanceListhistoricActivityInstanceQuery。list();for(HistoricActivityInstancehistoricActivityInstance:historicActivityInstanceList){StringactivityIdhistoricActivityInstance。getActivityId();System。out。println(activityIdactivityId);StringactivityNamehistoricActivityInstance。getActivityName();System。out。println(activityNameactivityName);StringprocessDefinitionIdhistoricActivityInstance。getProcessDefinitionId();System。out。println(processDefinitionIdprocessDefinitionId);StringprocessInstanceIdhistoricActivityInstance。getProcessInstanceId();System。out。println(processInstanceIdprocessInstanceId);}}} 如果本文对你有帮助,别忘记给我个3连,点赞,转发,评论, 咱们下期见!学习更多JAVA知识与技巧(获取原文),关注与私信博主(666)