Activiti工作流详解完整教程

合集下载

BPMN工作流的基本概念!详解工作流框架Activiti

BPMN工作流的基本概念!详解工作流框架Activiti

BPMN⼯作流的基本概念!详解⼯作流框架Activiti⼯作流⼯作流简介⼯作流(Workflow): ⼯作流就是通过计算机技术对业务流程进⾏⾃动化管理。

实现多个参与者按照预定的流程去⾃动执⾏业务流程。

定义: 通过计算机对业务流程⾃动化执⾏管理主要解决的是: 使在多个参与者之间按照某种预定义的规则⾃动进⾏传递⽂档,信息或任务的过程.从⽽实现某个预期的业务⽬标,或者促使此⽬标的实现⼯作流管理系统的⽬标:管理⼯作的流程以确保⼯作在正确的时间被期望的⼈员所执⾏在⾃动化进⾏的业务过程中插⼊⼈⼯的执⾏和⼲预⼯作流框架:Activiti,JBPM,OSWorkFlow,WorkFlow⼯作流框架底层需要有数据库提供⽀持⼯作流术语⼯作流引擎ProcessEngine对象: 这是Activiti⼯作的核⼼.负责⽣成流程运⾏时的各种实例及数据,监控和管理流程的运⾏BPM业务流程管理:是⼀种以规范化的构造端到端的卓越业务流程为中⼼,以持续的提⾼组织业务绩效为⽬的的系统化⽅法常见商业管理教育如EMBA,MBA等均将BPM包含在内BPMN业务流程建模与标注:这些图如何组合成⼀个业务流程图(Business Process Diagram)讨论BPMN的各种的⽤途:包括以何种精度来影响⼀个流程图中的模型BPMN作为⼀个标准的价值BPMN未来发展的远景流对象⼀个业务流程图有三个流对象的核⼼元素事件⼀个事件⽤圆圈来描述,表⽰⼀个业务流程期间发⽣的东西事件影响流程的流动.⼀般有⼀个原因(触发器)或⼀个影响(结果)基于它们对流程的影响,有三种事件:开始事件,中间事件,终⽌事件活动⽤圆⾓矩形表⽰,⼀个流程由⼀个活动或多个活动组成条件条件⽤菱形表⽰,⽤于控制序列流的分⽀与合并。

可以作为选择,包括路径的分⽀与合并内部的标记会给出控制流的类型Activiti开源⼯作流框架Activiti简介Activiti是⼀个开源的⼯作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进⾏流程调度Activiti 作为⼀个遵从 Apache 许可的⼯作流和业务流程管理开源平台,其核⼼是基于Java的超快速,超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌⼊性和可扩展性,同时更加强调⾯向业务⼈员Activiti 流程引擎重点关注在系统开发的易⽤性和轻量性上.每⼀项BPM业务功能Activiti流程引擎都以服务的形式提供给开发⼈员.通过使⽤这些服务,开发⼈员能够构建出功能丰富,轻便且⾼效的BPM应⽤程序Activiti服务结构Activiti系统服务结构图核⼼类:ProcessEngine: 流程引擎的抽象,可以通过此类获取需要的所有服务服务类:XxxService: 通过ProcessEngine获取,Activiti将不同⽣命周期的服务封装在不同Service中,包括定义,部署,运⾏.通过服务类可获取相关⽣命周期中的服务信息RepositoryServiceRepository Service提供了对repository的存取服务Activiti中每⼀个不同版本的业务流程的定义都需要使⽤⼀些定义⽂件,部署⽂件和⽀持数据(例如BPMN2.0XML⽂件,表单定义⽂件,流程定义图像⽂件等),这些⽂件都存储在Activiti内建的Repository中RuntimeServiceRuntime Service提供了启动流程,查询流程实例,设置获取流程实例变量等功能.此外它还提供了对流程部署,流程定义和流程实例的存取服务TaskServiceTask Service提供了对⽤户Task和Form相关的操作.它提供了运⾏时任务查询,领取,完成,删除以及变量设置等功能HistoryServiceHistory Service⽤于获取正在运⾏或已经完成的流程实例的信息,与Runtime Service中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化FormService使⽤Form Service可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单Activiti中的流程和状态Task均可以关联业务相关的数据IdentityServiceIdentity Service提供了对Activiti系统中的⽤户和组的管理功能Activiti中内置了⽤户以及组管理的功能,必须使⽤这些⽤户和组的信息才能获取到相应的TaskManagementServiceManagement Service提供了对Activiti流程引擎的管理和维护功能这些功能不在⼯作流驱动的应⽤程序中使⽤,主要⽤于 Activiti 系统的⽇常维护核⼼业务对象:org.activiti.engine.impl.persistence.entity包下的类,包括Task,ProcessInstance,Execution等根据不同职责实现相应接⼝的⽅法(如需要持久化则继承PersistentObject接⼝),与传统的实体类不同Activiti组件Activiti上下⽂组件Context: ⽤来保存⽣命周期⽐较长,全局性的信息,类似Application.主要包括如下三类:CommandContext: 命令上下⽂-保存每个命令必要的资源,如持久化需要的sessionProcessEngineConfigurationImpl: 流程引擎相关配置信息-整个引擎全局的配置信息.如数据源DataSource等.该对象为单例,在流程引擎创建的时候初始化ExecutionContext: 持有ExecutionEntity对象持久化组件:Activiti使⽤mybatis作OR映射,并在此基础上增加设计了⾃⼰的持久化框架在流程引擎创建时初始化,顶层接⼝Session,SessionFactorySession有两个实现类:DbSqlSession: 负责sql表达式的执⾏AbstractManager: 负责对象的持久化操作SessionFactory有两个实现类:DbSqlSessionFactory: 负责DbSqlSession相关操作GenericManagerFactory: 负责AbstractManager相关操作Event-Listener组件:Activiti允许客户代码介⼊流程执⾏,提供了事件监听组件监听的事件类型:TaskListenerJavaDelegateExpressionExecutionListenerProcessEngineConfigurationImpl持有DelegateInterceptor的某个实例,⽅便调⽤handleInvocation Cache组件DbSqlSession中有cache的实现Activiti基于List和Map来做缓存:如查询时先查缓存,没有则直接查询并放⼊缓存异步执⾏组件Activiti可以执⾏任务,JobExecutor为其核⼼类,JobExecutor包含三个主要属性:JobAcquisitionThreadBlockingQueueThreadPoolExecutor⽅法ProcessEngines在引擎启动时调⽤JobExecutor.start,JobAcquisitionThread 线程即开始⼯作,其run⽅法不断循环执⾏AcquiredJobs中的job,执⾏⼀次后线程等待⼀定时间直到超时或者JobExecutor.jobWasAdded⽅法,因为有新任务⽽被调⽤。

activiti7流程定义和流程实例

activiti7流程定义和流程实例

activiti7流程定义和流程实例一、概述流程定义是描述一个业务流程的规范和模板,而流程实例则是这个模板的具体执行过程。

A c ti vi ti7是一款开源的工作流引擎,用于管理和执行各种复杂的业务流程。

本文将详细介绍a ct iv it i7中流程定义和流程实例的概念、特点以及使用方法。

二、流程定义1.定义流程定义是将一个业务流程转化为可执行的工作流。

每个流程定义由一系列的节点和连接线组成,节点表示业务流程中的各个环节,连接线表示节点之间的流转关系。

流程定义规定了业务流程的执行顺序,以及每个环节的操作和规则。

2.特点-可视化:A ct iv it i7提供了图形化的流程设计工具,开发人员可以通过拖拽节点和连接线的方式来创建流程定义,使得流程定义更加直观和易于理解。

-灵活性:流程定义可以根据实际需求进行调整和修改,而不会影响已经在执行中的流程实例。

-可扩展性:Ac ti vit i7支持自定义的节点、表单和规则,可以根据业务需求对流程定义进行扩展和定制。

-可重用性:Ac ti vit i7支持流程定义的复用,可以将已经定义好的子流程作为模块,嵌入到其他流程中,提高了开发效率和代码的可维护性。

三、流程实例1.定义流程实例是流程定义的具体执行过程。

每个流程实例代表了一个具体的业务流程,在执行过程中会经历不同的节点和流转路径。

流程实例记录了流程的状态、执行历史和当前所处的节点。

2.特点-状态管理:Ac ti vit i7可以根据流程定义的配置自动管理流程的状态,包括待办、进行中、已完成等,使得流程执行更加可控和透明。

-跟踪和监控:A ct iv i ti7提供了流程实例的跟踪和监控功能,可以实时查看流程的执行情况、节点的处理结果以及处理人员的信息,方便管理人员进行流程监控和优化。

-异常处理:在流程执行过程中,可能会出现异常情况,比如节点处理超时、处理人员变更等。

Ac ti vi ti7提供了异常处理机制,可以及时捕捉和处理异常,保证流程的正确执行。

Activiti6.0工作流使用说明文档V1.0

Activiti6.0工作流使用说明文档V1.0

Activiti工作流使用说明文档V1.02019年8月9日目录一、模型设计器 (4)1.1任务 (5)1.1.1 用户任务 (5)1.1.2 服务任务 (5)1.1.3 脚本任务 (6)1.1.4 业务规则任务 (7)1.1.5 接收任务 (7)1.1.6 手动任务 (7)1.1.7 邮件任务 (8)1.1.8 Camel任务 (8)1.1.9 Mule任务 (8)1.1.10 决策任务 (9)1.2构造 (10)1.2.1 子流程 (10)1.2.2 事件子流程 (11)1.3泳道列表 (11)1.4分支 (12)1.4.1 排他分支 (12)1.4.2 并行分支 (12)1.4.3 包容分支 (13)1.4.4 事件分支 (13)1.5事件 (14)1.5.1 定时器事件 (14)1.5.2 信号事件 (14)1.5.3 消息事件 (16)1.5.4 错误事件 (16)1.5.5 边界事件 (17)1.5.6 中间事件 (18)1.5.7 开始事件 (18)1.5.8 结束事件 (18)1.6属性元素 (18)1.6.1 异步 (18)1.6.2 排他 (19)1.6.3 补偿 (19)1.6.4 中断任务 (20)1.6.5 分配 (21)1.6.6 到期时间 (22)1.6.7 表单 (22)1.6.8 表达式 (24)1.6.9 多实例 (25)1.7监听器配置 (28)1.7.1 执行监听器 (29)1.7.2 任务监听器 (30)1.7.3 事件监听器 (32)1.7.4 全局事件监听器 (33)二、workflow-service (34)2.1数据更新逻辑 (34)2.2方法表达式配置 (35)2.3自定义外置表单 (36)2.4事件监听器配置 (37)2.5方法调用说明 (37)三、常见问题 (37)一、模型设计器模型设计器项目qqdznyyglpt-workflow-designer主要完成自定义流程、表单设计,可以在模型设计器中完成整个功能的流转,但仅限与admin(密码默认为test)相同租户的用户可使用全功能,其他租户用户登录后只有流程设计、表单配置、决策表配置功能,无法在设计器进行流程执行。

Activiti使用步骤(IDEA)

Activiti使用步骤(IDEA)

Activiti使⽤步骤(IDEA)⼀.Activiti7体系架构通过加载activiti.cfg.xml⽂件得到ProcessEngineConfiguration对象,通过ProcessEngineConfiguration对象可以得到ProcessEngine对象得到该对象后,可以通过流程引擎对象ProcessEngine来得到各种Service,每⼀种Service接⼝有每个⽤途RepositoryService activiti 的资源管理类RuntimeService activiti 的流程运⾏管理类TaskService activiti 的任务管理类HistoryService activiti 的历史管理类ManagerService activiti 的引擎管理类⼆.Activiti使⽤步骤1.流程定义使⽤Activiti Designer⼯具创建流程图新建⼀个BPMNFile流程图,可更改该流程图的ID 和每个任务环节的执⾏⼈,流程图就是⼀个xml⽂件,每⼀个流程需要⽣成⼀张流程图保存, ⾸先将.bpmn⽂件改为.xml⽂件 然后右键该xml⽂件Diagrams--->show BPMN 2.0 Designer就能⽣成⼀张流程图, 将流程图导出保存到项⽬对应⽬录即可,然后将xml改回bpmn即可2.流程部署需要将流程部署到Activiti当中,代表当前有该流程/*** 流程部署* `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程⽂件信息* `act_re_deployment` 流程部署信息,包含流程名称,ID,Key等* `act_re_procdef` 流程定义信息*/@Testpublic void deployment() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RepositoryService对象进⾏流程部署RepositoryService repositoryService = processEngine.getRepositoryService();//进⾏部署,将对应的流程定义⽂件⽣成到数据库当中,作为记录进⾏保存Deployment deployment = repositoryService.createDeployment().addClasspathResource("bpmn/holiday.bpmn") //加载流程⽂件.addClasspathResource("bpmn/holiday.png").name("请假流程") //设置流程名称.key("holidayKey").deploy(); //部署//输出部署信息System.out.println("流程名称:" + deployment.getName());System.out.println("流程ID:" + deployment.getId());System.out.println("流程Key:" + deployment.getKey());}3.创建流程实例流程定义相当于类流程实例相当于类的实例(对象)/*** 启动流程实例* `act_hi_actinst` 已开始和执⾏完毕的活动信息* `act_hi_identitylink` 历史参与者信息* `act_hi_procinst` 流程实例信息* `act_hi_taskinst` 历史任务实例* act_ru_execution 任务执⾏信息* act_ru_identitylink 当前任务参与者* `act_ru_task` 任务信息*/@Testpublic void startInstance() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取到RuntimeService对象RuntimeService runtimeService = processEngine.getRuntimeService();//创建流程实例ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess_1");//红字是流程图的key值//输出实例信息System.out.println("流程部署ID:" + holiday.getDeploymentId());System.out.println("流程实例ID:" + holiday.getId());System.out.println("活动ID:" + holiday.getActivityId());}执⾏效果:`act_hi_actinst` 已开始和执⾏完毕的活动信息`act_hi_identitylink` 历史参与者信息`act_hi_procinst` 流程实例信息`act_hi_taskinst` 历史任务实例* act_ru_execution 任务执⾏信息* act_ru_identitylink 当前任务参与者* `act_ru_task` 任务信息4.⽤户查询代办任务/*** 查看代办任务*/@Testpublic void getTask() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfigurationProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取⼀个TaskService对象TaskService taskService = processEngine.getTaskService();//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执⾏者 processDefinitionKey:查询流程/*** taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn⽂件中定义的值* taskAssignee匹配规则:1.Assigned*//*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess_1").list();//分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);for (Task task : list) {System.out.println("任务名称:" + task.getName());System.out.println("任务执⾏⼈:" + task.getAssignee());System.out.println("任务ID:" + task.getId());System.out.println("流程实例ID:" + task.getProcessInstanceId());}}5.⽤户进⾏任务处理/*** 任务处理:当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看到该信息*/@Testpublic void completeTask() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取⼀个TaskService对象TaskService taskService = processEngine.getTaskService();//任务处理plete("2505");}先查看代办任务,再调⽤ plete(); ⽅法传⼊代办ID任务就被处理掉了上⼀步zhangsan被处理掉了,没有了代办任务,再查找zhangsan的下⼀步,lisi的代办任务发现lisi有了代办任务,数据库表也更新了处理完所有流程后ru表就为空了,数据都保存到了hi历史表6.流程结束7.当业务流程结束后通过历史可以查看到已经⾛完的流程/*** 查看历史任务*/@Testpublic void getHistory() {//获取ProcessEngine对象默认配置⽂件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取HistoryService接⼝HistoryService historyService = processEngine.getHistoryService();//获取历史任务HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();//获取指定流程实例的任务historicActivityInstanceQuery.processInstanceId("2501");//获取任务列表List<HistoricActivityInstance> list = historicActivityInstanceQuery.list();for (HistoricActivityInstance ai : list) {System.out.println("任务节点ID:"+ai.getActivityId());System.out.println("任务节点名称:"+ai.getActivityName());System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId());System.out.println("流程实例ID信息:"+ai.getProcessInstanceId());System.out.println("==============================");}}。

工作流Activit介绍与应用

工作流Activit介绍与应用

工作流Activiti介绍与应用工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。

我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化。

1Activiti简介Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。

它实现了BPMN 规范,可以发布设计好的流程定义,并通过api进行流程调度。

1.1Activiti基础编程框架Activiti的基础编程框架如下:Activiti基于Spring,ibatis等开源中间件作为软件平台,在此之上构建了非常清晰的开发框架。

上图列出了Activiti的核心组件。

:流程引擎的抽象,对于开发者来说,它是我们使用Activiti的外观(faade),通过它可以获得我们需要的一切服务。

(TaskService,RuntimeService,RepositoryService...):Activiti按照流程的生命周期(定义,部署,运行)把不同阶段的服务封装在不同的Service中,用户可以非常清晰地使用特定阶段的接口。

通过ProcessEngine能够获得这些Service实例。

1.2Activiti重要服务类ProcessEngine:流程引擎的抽象,通过它我们可以获得我们需要的一切服务。

RepositoryService: Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。

RepositoryService提供了对 repository 的存取服务。

TaskService:在Activiti业务流程定义中每一个执行节点都被称作一个Task,流程运行过程中,与每个任务节点相关的接口,比如complete, delete,delegate等等都是TaskService提供的。

工作流引擎activiti表结构和代码详解

工作流引擎activiti表结构和代码详解

工作流引擎activiti表结构和代码详解工作流引擎Activiti的表结构和代码详解Activiti是一个基于Java语言的工作流引擎,它提供了一种可执行业务流程的方式,实现了对流程进行定义、部署、执行、监控等全生命周期的管理,具有高效、灵活、可扩展等优点。

本文将详细介绍Activiti 的表结构和代码实现。

1. 表结构Activiti引擎定义了多张表,这些表按照功能可以分为以下几类:(1) 流程定义相关表ACT_GE_BYTEARRAY:流程定义和流程实例相关的二进制文件存储表,包括BPMN 2.0 XML文件和各种图片等资源文件。

ACT_RE_DEPLOYMENT:部署信息表,包含部署时间、部署后的ID 和名称。

ACT_RE_PROCDEF:流程定义信息表,包含流程ID、XML文件名、键值和流程部署ID等信息。

(2) 运行时数据表ACT_RU_EXECUTION:流程实例运行时数据表,包含流程实例ID、业务ID、当前任务ID等信息。

ACT_RU_TASK:任务运行时数据表,包含任务分配人、执行候选人、任务完成时间等信息。

(3) 历史数据表ACT_HI_PROCINST:流程实例历史数据表,包含流程实例ID、开始时间、结束时间等信息。

ACT_HI_TASKINST:任务历史数据表,包含任务分配人、执行人、开始时间等信息。

(4) 操作记录相关表ACT_HI_ACTINST:历史记录,包含流程实例ID、开始时间、结束时间等信息。

ACT_HI_COMMENT:批注表,记录了流程的操作记录和评论等信息。

2. 代码实现Activiti引擎在代码实现方面遵循了面向对象的思想和设计模式,其中核心类包括ProcessEngine、RepositoryService、RuntimeService和TaskService等。

下面通过实例代码来展示Activiti的各个组件之间的调用关系。

(1) 初始化ProcessEngineProcessEngine是Activiti引擎的核心组件,负责管理运行时数据、历史记录、任务等等。

activiti用法

activiti用法

activiti用法Activiti是一个基于Java的开源工作流引擎,它提供了完整的工作流程概念和一套完善的管理工具,包括典型的BPMN 2.0图形建模,在业务处理和应用开发中有着广泛的应用。

以下是使用Activiti的详细步骤:1.安装和配置Activiti首先,需要将Activiti工作流引擎下载并且解压缩,然后在应用程序中添加相关依赖。

在Spring框架中集成Activiti,只需要在Spring配置文件中添加Activiti相应的XML配置即可。

2.设计和部署应用程序在Activiti中,首先需要设计和构建工作流流程,通过Activiti Designer可以轻松地进行BPMN 2.0流程图的设计。

设计好后,将其导出为XML文件并部署到Activiti Engine中。

在Activiti中可以通过REST API来部署工作流程。

另外,也可以在命令行中执行相关的命令来部署工作流程。

3.使用Activiti API开发可以在应用程序中通过Activiti API来访问Activiti Engine提供的相关操作。

首先,需要创建流程引擎,之后可以使用它来访问Activiti工作流引擎。

然后,可以使用Activiti的API来启动流程实例、查询任务、完成任务等操作,在具体实现中,需要使用Activiti提供的Java代码段来完成相应的工作。

4.监控和管理在Activiti中,可以使用Activiti Explorer或者Activiti Admin应用程序来监控和管理工作流流程。

可以使用Activiti Explorer来查看/管理实例、任务、用户、组等信息,也可以在Activiti Admin中进行高级的调优和监控操作。

5.测试和优化在完成Activiti的开发之后,需要进行全面的测试和优化。

可以使用Junit来进行单元测试,使用性能测试工具来检测系统在高负载条件下的性能表现等。

可以通过具体的优化方案来提高Activiti系统的性能和稳定性,例如使用缓存、对数据库进行优化等方法。

activiti工作流表名及字段详解

activiti工作流表名及字段详解

1. activiti工作流简介activiti是一个轻量级的工作流引擎,它是一个开源的、Java语言的工作流和业务过程管理(BPM)评台。

activiti可以帮助开发者简化和优化企业的业务流程,提高工作效率,降低成本。

2. activiti工作流表名及字段详解在activiti的工作流引擎中,有一些核心的数据表用来存储流程定义、流程实例、任务等信息。

下面我们就来详细解释activiti的工作流表名及字段。

2.1 ACT_RE_*:流程存储表ACT_RE_*表是存储流程静态信息的表,包括流程定义、流程资源等。

ACT_RE_*表的常见字段包括:- ID: 唯一标识- NAME: 名称- KEY: 关键字- DEPLOYMENT_ID: 部署ID- RESOURCE_NAME: 资源名称- DGRM_RESOURCE_NAME: 流程图名称2.2 ACT_RU_*:运行时表ACT_RU_*表是存储流程运行时数据的表,包括流程实例、任务实例等。

ACT_RU_*表的常见字段包括:- ID: 唯一标识- REV: 版本号- EXECUTION_ID: 执行ID- PROC_DEF_ID: 流程定义ID- NAME: 名称- ASSIGNEE: 指派人- CREATE_TIME: 创建时间2.3 ACT_HI_*:历史数据表ACT_HI_*表是存储历史数据的表,包括流程实例的历史数据、任务的历史数据等。

ACT_HI_*表的常见字段包括:- PROC_DEF_ID: 流程定义ID- PROC_INST_ID: 流程实例ID- TASK_ID: 任务ID- START_TIME: 开始时间- END_TIME: 结束时间- DURATION: 持续时间2.4 其他表及字段在activiti工作流引擎中,还有一些其他重要的表和字段,包括ACT_ID_*表(存储用户、角色等信息)、ACT_GE_*表(存储通用的流程引擎数据)等。

Activiti工作流框架中的任务调度!工作流框架中的任务流程元素详解,使用监听器监听任务执行

Activiti工作流框架中的任务调度!工作流框架中的任务流程元素详解,使用监听器监听任务执行

Activiti⼯作流框架中的任务调度!⼯作流框架中的任务流程元素详解,使⽤监听器监听任务执⾏任务⽤户任务描述⽤户任务⽤来设置必须由⼈员完成的⼯作当流程执⾏到⽤户任务,会创建⼀个新任务,并把这个新任务加⼊到分配⼈或群组的任务列表中图形标记⽤户任务显⽰成⼀个普通任务(圆⾓矩形),左上⾓有⼀个⼩⽤户图标XML内容XML中的⽤户任务定义:id属性是必须的,name属性是可选的:<userTask id="theTask" name="Important task" />⽤户任务可以设置描述,添加documentation元素可以定义描述:<userTask id="theTask" name="Schedule meeting" ><documentation>Schedule an engineering meeting for next week with the new hire.</documentation>描述⽂本可以通过标准的java⽅法来获取:task.getDescription()持续时间任务可以⽤⼀个字段来描述任务的持续时间可以使⽤查询API来对持续时间进⾏搜索,根据在时间之前或之后进⾏搜索Activiti提供了⼀个节点扩展,在任务定义中设置⼀个表达式,这样在任务创建时就可以设置初始持续时间表达式应该是:java.util.Datejava.util.String(ISO8601格式),ISO8601持续时间(⽐如PT50M)null在流程中使⽤上述格式输⼊⽇期,或在前⼀个服务任务中计算⼀个时间.这⾥使⽤了持续时间,持续时间会基于当前时间进⾏计算,再通过给定的时间段累加: 使⽤"PT30M"作为持续时间,任务就会从现在开始持续30分钟<userTask id="theTask" name="Important task" activiti:dueDate="${dateVariable}"/>任务的持续时间也可以通过TaskService修改,或在TaskListener中通过传⼊的DelegateTask参数修改⽤户分配⽤户任务可以直接分配给⼀个⽤户,通过humanPerformer元素定义humanPerformer定义需要⼀个resourceAssignmentExpression来实际定义⽤户.⽬前只⽀持formalExpressions<process ... >...<userTask id='theTask' name='important task' ><humanPerformer><resourceAssignmentExpression><formalExpression>kermit</formalExpression></resourceAssignmentExpression></humanPerformer></userTask>只有⼀个⽤户可以作为任务的执⾏者分配⽤户在activiti中,⽤户叫做执⾏者拥有执⾏者的⽤户不会出现在其他⼈的任务列表中,只能出现执⾏者的个⼈任务列表中直接分配给⽤户的任务可以通过TaskService获取:List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();任务也可以加⼊到⼈员的候选任务列表中.需要使⽤potentialOwner元素⽤法和humanPerformer元素类似,需要指定表达式中的每个项⽬是⼈员还是群组<process ... >...<userTask id='theTask' name='important task' ><potentialOwner><resourceAssignmentExpression><formalExpression>user(kermit), group(management)</formalExpression></resourceAssignmentExpression></potentialOwner></userTask>使⽤potentialOwner元素定义的任务可以通过TaskService获取:List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit");这会获取所有kermit为候选⼈的任务,表达式中包含user(kermit).这也会获得所有分配包含kermit这个成员的群组(⽐如,group(management),前提是kermit是这个组的成员,并且使⽤了activiti的账号组件).⽤户所在的群组是在运⾏阶段获取的, 它们可以通过IdentityService进⾏管理如果没有显式指定设置的是⽤户还是群组,引擎会默认当做群组处理下⾯的设置与使⽤group(accountancy)⼀样:<formalExpression>accountancy</formalExpression>Activiti对任务分配的扩展当分配不复杂时,⽤户和组的设置⾮常⿇烦.为避免复杂性,可以使⽤⽤户任务的⾃定义扩展assignee属性: 直接把⽤户任务分配给指定⽤户(和使⽤humanPerformer 效果完全⼀样)<userTask id="theTask" name="my task" activiti:assignee="kermit" />candidateUsers属性: 为任务设置候选⼈(和使⽤potentialOwner效果完全⼀样,不需要像使⽤potentialOwner通过user(kermit)声明,这个属性只能⽤于⼈员)<userTask id="theTask" name="my task" activiti:candidateUsers="kermit, gonzo" />candidateGroups属性: 为任务设置候选组(和使⽤potentialOwner效果完全⼀样,不需要像使⽤potentialOwner通过group(management)声明,这个属性只能⽤于群组)<userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />candidateUsers和candidateGroups可以同时设置在同⼀个⽤户任务中Activiti中虽然有账号管理组件和IdentityService ,账号组件不会检测设置的⽤户是否存在. Activiti允许与其他已存的账户管理⽅案集成使⽤创建事件的任务监听器来实现⾃定义的分配逻辑:<userTask id="task1" name="My task" ><extensionElements><activiti:taskListener event="create" class="org.activiti.MyAssignmentHandler" /></extensionElements></userTask>DelegateTask会传递给TaskListener的实现,通过它可以设置执⾏⼈,候选⼈和候选组public class MyAssignmentHandler implements TaskListener {public void notify(DelegateTask delegateTask) {// Execute custom identity lookups here// and then for example call following methods:delegateTask.setAssignee("kermit");delegateTask.addCandidateUser("fozzie");delegateTask.addCandidateGroup("management");...}}使⽤spring时,使⽤表达式把任务监听器设置为spring代理的bean,让这个监听器监听任务的创建事件⽰例:执⾏者会通过调⽤ldapService这个spring bean的findManagerOfEmployee⽅法获得.流程变量emp会作为参数传递给bean<userTask id="task" name="My Task" activiti:assignee="${ldapService.findManagerForEmployee(emp)}"/>可以⽤来设置候选⼈和候选组:<userTask id="task" name="My Task" activiti:candidateUsers="${ldapService.findAllSales()}"/>⽅法返回类型只能为String(候选⼈) 或Collection < String >(候选组):public class FakeLdapService {public String findManagerForEmployee(String employee) {return "Kermit The Frog";}public List<String> findAllSales() {return Arrays.asList("kermit", "gonzo", "fozzie");}}脚本任务描述脚本任务是⼀个⾃动节点当流程到达脚本任务,会执⾏对应的脚本图形标记脚本任务显⽰为标准BPMN 2.0任务(圆⾓矩形),左上⾓有⼀个脚本⼩图标XML内容脚本任务定义需要指定script和scriptFormat<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy"><script>sum = 0for ( i in inputArray ) {sum += i}</script></scriptTask>scriptFormat的值必须兼容JSR-223(java平台的脚本语⾔).默认Javascript会包含在JDK中,不需要额外的依赖.如果要使⽤其他的脚本引擎,必须要是JSR-223引擎兼容的.还需要把对应的jar添加到classpath下, 并使⽤合适的名称:activiti单元测试经常使⽤groovygroovy脚本引擎放在groovy-all.jar中,在2.0版本之前,脚本引擎是groovy jar的⼀部分.使⽤需要添加依赖:<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.x.x<version></dependency>脚本变量到达脚本任务的流程可以访问的所有流程变量,都可以在脚本中使⽤<script>sum = 0for ( i in inputArray ) {sum += i}</script>也可以在脚本中设置流程变量,直接调⽤execution.setVariable("variableName", variableValue) 默认,不会⾃动保存变量(activiti 5.12之前) 可以在脚本中⾃动保存任何变量,只要把scriptTask的autoStoreVariables属性设置为true 最佳实践是不要使⽤,⽽是显式调⽤execution.setVariable()<scriptTask id="script" scriptFormat="JavaScript" activiti:autoStoreVariables="false">参数默认为false: 如果没有为脚本任务定义设置参数,所有声明的变量将只存在于脚本执⾏的阶段在脚本中设置变量: 这些命名已经被占⽤,不能⽤作变量名- out, out:print, lang:import, context, elcontext.<script>def scriptVar = "test123"execution.setVariable("myVar", scriptVar)</script>脚本结果脚本任务的返回值可以通过制定流程变量的名称,分配给已存在或者⼀个新流程变量,需要使⽤脚本任务定义的'activiti:resultVariable'属性任何已存在的流程变量都会被脚本执⾏的结果覆盖如果没有指定返回的变量名,脚本的返回值会被忽略<scriptTask id="theScriptTask" name="Execute script" scriptFormat="juel" activiti:resultVariable="myVar"><script>#{echo}</script></scriptTask>脚本的结果-表达式 #{echo} 的值会在脚本完成后,设置到myVar变量中Java服务任务描述Java服务任务⽤来调⽤外部Java类图形标记Java服务任务显⽰为圆⾓矩形,左上⾓有⼀个齿轮⼩图标XML内容声明Java调⽤逻辑有四种⽅式:实现JavaDelegate或者ActivityBehavior执⾏解析代理对象的表达式调⽤⼀个⽅法表达式调⽤⼀个值表达式执⾏⼀个在流程执⾏中调⽤的类,需要在activiti:class属性中设置全类名:<serviceTask id="javaService"name="My Java Service Task"activiti:class="org.activiti.MyJavaDelegate" />使⽤表达式调⽤⼀个对象,对象必须遵循⼀些规则,并使⽤activiti:delegateExpression属性进⾏创建:<serviceTask id="serviceTask" activiti:delegateExpression="${delegateExpressionBean}" />delegateExpressionBean是⼀个实现了JavaDelegate接⼝的bean,定义在实例的spring容器中要执⾏指定的UEL⽅法表达式, 需要使⽤activiti:expression:<serviceTask id="javaService"name="My Java Service Task"activiti:expression="#{printer.printMessage()}" />⽅法printMessage()会调⽤名为printer对象的⽅法为表达式中的⽅法传递参数:<serviceTask id="javaService"name="My Java Service Task"activiti:expression="#{printer.printMessage(execution, myVar)}" />调⽤名为printer对象上的⽅法printMessage.第⼀个参数是DelegateExecution, 在表达式环境中默认名称为execution. 第⼆个参数传递的是当前流程的名为myVar的变量要执⾏指定的UEL⽅法表达式, 需要使⽤activiti:expression:<serviceTask id="javaService"name="My Java Service Task"activiti:expression="#{split.ready}" />ready属性的getter⽅法:getReady() 会作⽤于名为split的bean上.这个对象会被解析为流程对象和spring环境中的对象实现要在流程执⾏中实现⼀个调⽤的类,这个类需要实现org.activiti.engine.delegate.JavaDelegate接⼝,并在execute⽅法中提供对应的业务逻辑.当流程执⾏到特定阶段,会指定⽅法中定义好的业务逻辑,并按照默认BPMN 2.0中的⽅式离开节点⽰例: 创建⼀个java类的例⼦,对流程变量中字符串转换为⼤写这个类需要实现org.activiti.engine.delegate.JavaDelegate接⼝,要求实现execute(DelegateExecution) ⽅法,包含的业务逻辑会被引擎调⽤流程实例信息:流程变量和其他信息,可以通过DelegateExecution接⼝访问和操作public class ToUppercase implements JavaDelegate {public void execute(DelegateExecution execution) throws Exception {String var = (String) execution.getVariable("input");var = var.toUpperCase();execution.setVariable("input", var);}}serviceTask定义的class只会创建⼀个java类的实例所有流程实例都会共享相同的类实例,并调⽤execute(DelegateExecution) 类不能使⽤任何成员变量,必须是线程安全的,必须能模拟在不同线程中执⾏.影响着属性注⼊的处理⽅式流程定义中引⽤的类(activiti:class)不会在部署时实例化只有当流程第⼀次执⾏到使⽤类的时候,类的实例才会被创建如果找不到类,会抛出⼀个ActivitiException这个原因是部署环境(更确切是的classpath)和真实环境往往是不同的:当使⽤ant或业务归档上传到Activiti Explorer来发布流程,classpath没有包含引⽤的类内部实现类也可以提供实现org.activiti.engine.impl.pvm.delegate.ActivityBehavior接⼝的类实现可以访问更强⼤的ActivityExecution,它可以影响流程的流向注意: 这应该尽量避免.只有在⾼级情况下并且确切知道要做什么的情况下,再使⽤ActivityBehavior接⼝属性注⼊为代理类的属性注⼊数据. ⽀持如下类型的注⼊: 固定的字符串表达式如果有效的话,数值会通过代理类的setter⽅法注⼊,遵循java bean的命名规范(⽐如fistName属性对应setFirstName(Xxx)⽅法)如果属性没有对应的setter⽅法,数值会直接注⼊到私有属性中⼀些环境的SecurityManager不允许修改私有属性,要把想注⼊的属性暴露出对应的setter⽅法来⽆论流程定义中的数据是什么类型,注⼊⽬标的属性类型都应该是 org.activiti.engine.delegate.Expression⽰例: 把⼀个常量注⼊到属性中属性注⼊可以使⽤class属性在声明实际的属性注⼊之前,需要定义⼀个extensionElements的XML元素<serviceTask id="javaService"name="Java service invocation"activiti:class="org.activiti.examples.bpmn.servicetask.ToUpperCaseFieldInjected"><extensionElements><activiti:field name="text" stringValue="Hello World" /></extensionElements></serviceTask>ToUpperCaseFieldInjected类有⼀个text属性,类型是org.activiti.engine.delegate.Expression. 调⽤text.getValue(execution) 时,会返回定义的字符串Hello World可以使⽤长⽂字(⽐如,内嵌的email),使⽤activiti:string⼦元素:<serviceTask id="javaService"name="Java service invocation"activiti:class="org.activiti.examples.bpmn.servicetask.ToUpperCaseFieldInjected"><extensionElements><activiti:field name="text"><activiti:string>Hello World</activiti:string></activiti:field></extensionElements></serviceTask>可以使⽤表达式,实现在运⾏期动态解析注⼊的值这些表达式可以使⽤流程变量或spring定义的bean.服务任务中的java类实例会在所有流程实例中共享:为了动态注⼊属性的值,可以在org.activiti.engine.delegate.Expression中使⽤值和⽅法表达式会使⽤传递给execute⽅法的DelegateExecution参数进⾏解析<serviceTask id="javaService" name="Java service invocation"activiti:class="org.activiti.examples.bpmn.servicetask.ReverseStringsFieldInjected"><extensionElements><activiti:field name="text1"><activiti:expression>${genderBean.getGenderString(gender)}</activiti:expression></activiti:field><activiti:field name="text2"><activiti:expression>Hello ${gender == 'male' ? 'Mr.' : 'Mrs.'} ${name}</activiti:expression></activiti:field></ extensionElements></ serviceTask>⽰例: 注⼊表达式,并使⽤在当前传⼊的DelegateExecution解析:public class ReverseStringsFieldInjected implements JavaDelegate {private Expression text1;private Expression text2;public void execute(DelegateExecution execution) {String value1 = (String) text1.getValue(execution);execution.setVariable("var1", new StringBuffer(value1).reverse().toString());String value2 = (String) text2.getValue(execution);execution.setVariable("var2", new StringBuffer(value2).reverse().toString());}}可以把表达式设置成⼀个属性,⽽不是⼦元素:因为java类实例会被重⽤,注⼊只会发⽣⼀次,当服务任务调⽤第⼀次的时候发⽣注⼊当代码中的属性改变了,值也不会重新注⼊,把它们看作是不变的,不⽤修改它们服务任务结果服务流程返回的结果(使⽤表达式的服务任务)可以分配给已经存在的或新的流程变量通过指定服务任务定义的activiti:resultVariable属性来实现指定的流程变量会被服务流程的返回结果覆盖如果没有指定返回变量名,就会忽略返回结果<serviceTask id="aMethodExpressionServiceTask"activiti:expression="#{myService.doSomething()}"activiti:resultVariable="myVar" />服务流程的返回值(在myService上调⽤doSomething() ⽅法的返回值,myService可能是流程变量,也可能是spring的bean),在服务执⾏完成之后,会设置到名为myVar的流程变量⾥处理异常执⾏⾃定义逻辑时,常常需要捕获对应的业务异常,在流程内部进⾏处理抛出BPMN Errors: 在服务任务或脚本任务的代码⾥抛出BPMN error: 要从JavaDelegate,脚本,表达式和代理表达式中抛出名为BpmnError的特殊ActivitiExeption 引擎会捕获这个异常,把它转发到对应的错误处理中:边界错误事件或错误事件⼦流程public class ThrowBpmnErrorDelegate implements JavaDelegate {public void execute(DelegateExecution execution) throws Exception {try {executeBusinessLogic();} catch (BusinessException e) {throw new BpmnError("BusinessExceptionOccured");}}}构造参数是错误代码,会被⽤来决定哪个错误处理器会来响应这个错误这个机制只⽤于业务失败,应该被流程定义中设置的边界错误事件或错误事件⼦流程处理. 技术上的错误应该使⽤其他异常类型,通常不会在流程⾥处理异常顺序流: 内部实现类在⼀些异常发⽣时,让流程进⼊其他路径<serviceTask id="javaService"name="Java service invocation"activiti:class="org.activiti.ThrowsExceptionBehavior"></serviceTask><sequenceFlow id="no-exception" sourceRef="javaService" targetRef="theEnd" /><sequenceFlow id="exception" sourceRef="javaService" targetRef="fixException" />这⾥的服务任务有两个外出顺序流:分别叫exception和no-exception. 异常出现时会使⽤顺序流的ID来决定流向public class ThrowsExceptionBehavior implements ActivityBehavior {public void execute(ActivityExecution execution) throws Exception {String var = (String) execution.getVariable("var");PvmTransition transition = null;try {executeLogic(var);transition = execution.getActivity().findOutgoingTransition("no-exception");} catch (Exception e) {transition = execution.getActivity().findOutgoingTransition("exception");}execution.take(transition);}}JavaDelegate使⽤Activiti服务需要在Java服务任务中使⽤Activiti服务的场景: ⽐如,通过RuntimeService启动流程实例,⽽callActivity不满⾜需求org.activiti.engine.delegate.DelegateExecution允许通过 org.activiti.engine.EngineServices接⼝直接获得这些服务:public class StartProcessInstanceTestDelegate implements JavaDelegate {public void execute(DelegateExecution execution) throws Exception {RuntimeService runtimeService = execution.getEngineServices().getRuntimeService();runtimeService.startProcessInstanceByKey("myProcess");}}所有activiti服务的API都可以通过这个接⼝获得使⽤这些API调⽤出现的所有数据改变,都是在当前事务中在例如spring和CDI这样的依赖注⼊环境也会起作⽤,⽆论是否启⽤了JTA数据源⽰例: 下⾯的代码功能与上⾯的代码⼀致,这是RuntimeService是通过依赖注⼊获得,⽽不是通过org.activiti.engine.EngineServices接⼝@Component("startProcessInstanceDelegate")public class StartProcessInstanceTestDelegateWithInjection {@Autowiredprivate RuntimeService runtimeService;public void startProcess() {runtimeService.startProcessInstanceByKey("oneTaskProcess");}}因为服务调⽤是在当前事务⾥,数据的产⽣或改变,在服务任务执⾏完之前,还没有提交到数据库.所以API对于数据库数据的操作,意味着未提交的操作在服务任务的API调⽤中都是不可见的WebService任务描述WebService任务可以⽤来同步调⽤⼀个外部的WebService图形标记WebService任务与Java服务任务显⽰效果⼀样(圆⾓矩形,左上⾓有⼀个齿轮⼩图标)XML内容要使⽤WebService需要导⼊操作和类型,可以使⽤import标签来指定WebService的WSDL<import importType="/wsdl/"location="http://localhost:63081/counter?wsdl"namespace="/" />声明告诉activiti导⼊WSDL定义,但没有创建itemDefinition和message假设想调⽤⼀个名为prettyPrint的⽅法,必须创建为请求和响应信息对应的message和itemDefinition <message id="prettyPrintCountRequestMessage" itemRef="tns:prettyPrintCountRequestItem" /><message id="prettyPrintCountResponseMessage" itemRef="tns:prettyPrintCountResponseItem" /><itemDefinition id="prettyPrintCountRequestItem" structureRef="counter:prettyPrintCount" /><itemDefinition id="prettyPrintCountResponseItem" structureRef="counter:prettyPrintCountResponse" />在申请服务任务之前,必须定义实际引⽤WebService的BPMN接⼝和操作基本上,定义接⼝和必要的操作.对每个操作都会重⽤上⾯定义的信息作为输⼊和输出⽰例: 定义了counter接⼝和prettyPrintCountOperation操作:<interface name="Counter Interface" implementationRef="counter:Counter"><operation id="prettyPrintCountOperation" name="prettyPrintCount Operation"implementationRef="counter:prettyPrintCount"><inMessageRef>tns:prettyPrintCountRequestMessage</inMessageRef><outMessageRef>tns:prettyPrintCountResponseMessage</outMessageRef></operation></interface>然后定义WebService任务,使⽤WebService实现,并引⽤WebService操作<serviceTask id="webService"name="Web service invocation"implementation="##WebService"operationRef="tns:prettyPrintCountOperation">WebService任务IO规范每个WebService任务可以定义任务的输⼊输出IO规范<ioSpecification><dataInput itemSubjectRef="tns:prettyPrintCountRequestItem" id="dataInputOfServiceTask" /><dataOutput itemSubjectRef="tns:prettyPrintCountResponseItem" id="dataOutputOfServiceTask" /><inputSet><dataInputRefs>dataInputOfServiceTask</dataInputRefs></inputSet><outputSet><dataOutputRefs>dataOutputOfServiceTask</dataOutputRefs></outputSet></ioSpecification>WebService任务数据输⼊关联指定数据输⼊关联有两种⽅式:使⽤表达式使⽤简化⽅式使⽤表达式指定数据输⼊关联: 需要定义来源和⽬的item,并指定每个item属性之间的对应关系:<dataInputAssociation><sourceRef>dataInputOfProcess</sourceRef><targetRef>dataInputOfServiceTask</targetRef><assignment><from>${dataInputOfProcess.prefix}</from><to>${dataInputOfServiceTask.prefix}</to></assignment><assignment><from>${dataInputOfProcess.suffix}</from><to>${dataInputOfServiceTask.suffix}</to></assignment></dataInputAssociation>分配item的前缀和后缀使⽤简化⽅式指定数据输⼊关联: sourceRef元素是activiti的变量名,targetRef元素是item定义的⼀个属性:<dataInputAssociation><sourceRef>PrefixVariable</sourceRef><targetRef>prefix</targetRef></dataInputAssociation><dataInputAssociation><sourceRef>SuffixVariable</sourceRef><targetRef>suffix</targetRef></dataInputAssociation>PrefixVariable变量的值分配给prefix属性,把SuffixVariable变量的值分配给suffix属性WebService任务数据输出关联指定数据输出关联有两种⽅式:使⽤表达式使⽤简化⽅式使⽤表达式指定数据输出关联: 需要定义⽬的变量和来源表达式<dataOutputAssociation><targetRef>dataOutputOfProcess</targetRef><transformation>${dataOutputOfServiceTask.prettyPrint}</transformation></dataOutputAssociation>⽅法和数据输⼊关联完全⼀样使⽤简化⽅式指定数据输出关联: sourceRef元素是item定义的⼀个属性,targetRef元素是activiti的变量名<dataOutputAssociation><sourceRef>prettyPrint</sourceRef><targetRef>OutputVariable</targetRef></dataOutputAssociation>⽅法和数据输⼊关联完全⼀样业务规则任务描述业务规则任务⽤来同步执⾏⼀个或多个规则Activiti使⽤drools规则引擎执⾏业务规则: 包含业务规则的.drl⽂件必须和流程定义⼀起发布流程定义⾥包含了执⾏这些规则的业务规则任务流程使⽤的所有.drl⽂件都必须打包在流程BAR⽂件⾥如果想要⾃定义规则任务的实现: 想⽤不同⽅式使⽤drools,或者使⽤完全不同的规则引擎.你可以使⽤BusinessRuleTask上的class或表达式属性图形标记业务规则任务是⼀个圆⾓矩形,左上⾓使⽤⼀个表格⼩图标进⾏显⽰XML内容要执⾏部署流程定义的BAR⽂件中的⼀个或多个业务规则,需要定义输⼊和输出变量:对于输⼊变量定义,可以使⽤逗号分隔的⼀些流程变量输出变量定义只包含⼀个变量名,会把执⾏业务规则后返回的对象保存到对应的流程变量中注意: 结果变量会包含⼀个对象列表,如果没有指定输出变量名称,默认会使⽤ org.activiti.engine.rules.OUTPUT<process id="simpleBusinessRuleProcess"><startEvent id="theStart" /><sequenceFlow sourceRef="theStart" targetRef="businessRuleTask" /><businessRuleTask id="businessRuleTask" activiti:ruleVariablesInput="${order}"activiti:resultVariable="rulesOutput" /><sequenceFlow sourceRef="businessRuleTask" targetRef="theEnd" /><endEvent id="theEnd" /></process>业务规则任务也可以配置成只执⾏部署的.drl⽂件中的⼀些规则.这时要设置逗号分隔的规则名,只会执⾏rule1和rule2:<businessRuleTask id="businessRuleTask" activiti:ruleVariablesInput="${order}"activiti:rules="rule1, rule2" />定义哪些规则不⽤执⾏:除了rule1和rule2以外,所有部署到流程定义同⼀个BAR⽂件中的规则都会执⾏:<businessRuleTask id="businessRuleTask" activiti:ruleVariablesInput="${order}"activiti:rules="rule1, rule2" exclude="true" />可以⽤⼀个选项修改BusinessRuleTask的实现:<businessRuleTask id="businessRuleTask" activiti:class="${MyRuleServiceDelegate}" />BusinessRuleTask的功能和ServiceTask⼀样,但是使⽤BusinessRuleTask的图标来表⽰在这⾥要执⾏业务规则邮件任务Activiti强化了业务流程,⽀持⾃动邮件任务: 可以发送邮件给⼀个或多个参与者,包括⽀持cc,bcc,HTML内容等等邮件任务不是BPMN 2.0规范定义的官⽅任务,Activiti中邮件任务是⽤专门的服务任务实现的邮件服务器配置Activiti引擎要通过⽀持SMTP功能的外部邮件服务器发送邮件为了实际发送邮件,引擎穾知道如何访问邮件服务器.下⾯的配置可以设置到activiti.cfg.xml配置⽂件中:属性是否必须描述mailServerHost否邮件服务器的主机名(⽐如:).默认为localhostmailServerPort 是如果没有使⽤默认端⼝邮件服务器上的SMTP传输端⼝.默认为25mailServerDefaultFrom否如果⽤户没有指定发送邮件的邮件地址,默认设置的发送者的邮件地址。

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

2021全⽹最全Activiti7教程02(Activiti7⼊门使⽤-欢迎收藏)全⽹最详细Activiti系列⽂章,强烈建议收藏加关注哦!Activiti的⼊门应⽤1Activiti的基本使⽤1.1 创建Maven项⽬ 创建⼀个普通的Maven项⽬,并添加相关的依赖<properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><activiti.version>7.0.0.Beta1</activiti.version></properties><dependencies><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>${activiti.version}</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 模型处理 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 转换 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>${activiti.version}</version></dependency><!-- bpmn json数据转换 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 布局 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-layout</artifactId><version>${activiti.version}</version><exclusions><exclusion><groupId>com.github.jgraph</groupId><artifactId>jgraphx</artifactId></exclusion></exclusions></dependency><!-- activiti 云⽀持 --><dependency><groupId>org.activiti.cloud</groupId><artifactId>activiti-cloud-services-api</artifactId><version>${activiti.version}</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency><!-- mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!-- 链接池 --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency></dependencies>1.2 log4j 添加⼀个⽇志⽂件log4j.properties# Set root category priority to INFO and its only appender to CONSOLE.#log4j.rootCategory=INFO, CONSOLE debug info warn error fatallog4j.rootCategory=debug, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE..apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.log4j.appender.LOGFILE=org.apache.log4j.FileAppenderlog4j.appender.LOGFILE.File=d:\log\act\activiti.loglog4j.appender.LOGFILE.Append=trueyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n1.3 添加Activiti配置⽂件 我们在本案例中使⽤的数据库是mysql8.0. Activiti的默认的使⽤⽅式是要求我们在resources下创建activiti.cfg.xml⽂件,默认的⽅式的名称是不能修改的。

工作流activiti介绍

工作流activiti介绍

Activiti6工作流1、Activiti工作流概述1.1、工作流概述工作流(Workflow),就是通过计算机对业务流程自动化执行管理。

它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

在我们日常的工作中,每时每刻都在执行一个个的流程,我们可能是流程的发起人,也可能能是流程的中间人,甚至是最后终止一个流程的大boss,总体而言流程,即工作流就是为了团队协作而生,任何需要团队持续写作的场景都有必要用到工作流。

比如老生常谈的员工请假,发出请求,逐级上报,逐级审批。

在我们的项目中也是一样,很多项目都是存在业务流程。

1.2、工作流系统一个软件系统中具有工作流的功能,我们把它称为工作流系统,一个系统中工作流的功能是什么?就是对系统的业务流程进行自动化管理,所以工作流是建立在业务流程的基础上,所以一个软件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。

即使没有工作流业务系统也可以开发运行,只不过有了工作流可以更好的管理业务流程,提高系统的可扩展性。

常见的工作流有:请假流程、出差申请流程、出差申请流程项目研发流程1.3 工作流的实现没有用工作流之前我们是怎么做的?我们之前为了实现流程控制, 通常是通过状态(status)字段的值,来跟踪流程状态,但是不完美比如请假流程:员工申请-> 部门经理审批-> 人事存档我们要给status字段设置状态: 0 = 员工未提交; 1 = 员工已提交; 2= 部门经理拒绝审批; 3 = 部门经理同意审批; 最终人事查询status= 4也就是申请成功的请假单数据通过状态字段我们虽然可以实现流程的控制但是弊端也很明显: 当我们那不讲武德的产品经理说出“这个功能要改”的时候我们只能去改变代码比如: 在这个部门经理的后面在加一个总经理审批的功能, 则程序不能用了那么能不能做到流程业务变化后,程序可以不用变呢?使用工作流之后改善了我们哪些问题?Activiti能做到当需求变更时,代码不需要发生改变,只需要更新业务流程图即可.二、Activiti概述Activiti是一个工作流引擎,activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

activiti源码解读 并加中文注释

activiti源码解读 并加中文注释

为了更好地理解和使用Activiti工作流引擎,我们有必要对其源码进行深入的解读和学习。

在本文中,我们将针对Activiti工作流引擎的源码进行解读,并添加中文注释,以便读者可以更好地理解其原理和实现。

一、Activiti工作流引擎概述1.1 概述Activiti是一个轻量级的工作流引擎,它实现了BPMN 2.0规范,并提供了丰富的API和工具,方便开发人员进行流程设计、部署和执行。

1.2 应用场景Activiti广泛应用于企业中的各种业务流程,如审批流程、请假流程、报销流程等,通过Activiti可以实现流程的自动化和规范化,提高工作效率和质量。

1.3 核心特性Activiti工作流引擎具有以下核心特性:- 支持BPMN 2.0规范,可以对复杂的业务流程进行建模和执行;- 提供了丰富的API和工具,方便开发人员进行流程管理和监控;- 支持分布式部署,可以满足高并发、高可用的业务需求。

二、Activiti源码解读2.1 模块解析Activiti源码主要包括以下几个模块:- activiti-engine:工作流引擎的核心实现,包括流程定义、流程实例、任务管理等;- activiti-bpmn-converter:BPMN 2.0规范的解析和转换;- activiti-rest:RESTful API的实现;- activiti-spring:与Spring框架的集成;- ...2.2 核心类解析Activiti工作流引擎的核心类包括ProcessEngine、RepositoryService、RuntimeService、TaskService等,这些类负责流程定义、流程执行、任务管理等核心功能的实现。

2.3 核心流程解析Activiti工作流引擎的核心流程包括流程定义、流程部署、流程执行等,这些流程通过一系列的核心类和接口进行协同工作,并最终实现业务流程的自动化和规范化。

2.4 核心算法解析Activiti工作流引擎的核心算法包括流程的解析、执行和监控,这些算法通过一系列的数据结构和设计模式进行实现,保证了工作流引擎的高性能和可靠性。

手把手教你如何玩转Activiti工作流

手把手教你如何玩转Activiti工作流

⼿把⼿教你如何玩转Activiti⼯作流⼿把⼿教你如何玩转Activiti⼯作流版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。

https:///Cs_hnu_scw/article/details/79059965⼀:Activiti的介绍场景:学校主⾓:阿⽑,班主任,教务处处长问题:有⼀天,阿⽑到学校,感觉到⾝体不舒服,然后想跟班主任请假,然后班主任告诉阿⽑说,你想请假,那么就必须要请假条,这个上⾯必须要我同意,然后再拿到教务处去盖章,然后交给我,这样才可以进⾏请假。

阿⽑,想着,怎么请个假都这么⿇烦,这么多层次处理问题,能不能简便⼀点。

好烦好烦~!!~~分析:从上⾯的⼩例⼦,我们可以很明显的得到⼀个结论,就是:请假流程:阿⽑------》提交申请-----》班主任审批-----》教务处审批-----》请假成功也就是说,这种问题就是⼀种流式的控制管理,当然,这是最简单的,因为⾥⾯没有包含着回馈,相当于只是⼀个⽅向。

其实,到这⾥,Activiti的定义就已经出来了。

Activiti定义:Activiti5是由Alfresco软件在2010年5⽉17⽇发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、⼯作流、服务协作等领域的⼀个开源的、灵活的、易扩展的可执⾏流程语⾔框架。

Activiti基于Apache许可的开源BPM平台,创始⼈Tom Baeyens是JBoss jBPM的项⽬架构师,它特⾊是提供了eclipse插件,开发⼈员可以通过插件直接绘画出业务流程图。

⼆:⽜⼑⼩试---------搭建第⼀个Activiti项⽬流程环境:IDEA(或者Eclipse,本⼈这⾥是⽤IDEA进⾏的)步骤:(1)第⼀步:IDEA安装Activiti插件⾸先,创建⼀个普通的Java⼯程即可,然后按照下⾯流程进⾏:1:点击菜单中的File(最左上⾓),选择settings2:33:然后点击右边的安装,等待⼀下就可以啦。

activiti工作流程介绍

activiti工作流程介绍

1、activiti工作流简介
Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项 目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens 担任。 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始 构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组 (OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实 现。 创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师 Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可 的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立于Alfresco开 源ECM系统运行。 Activiti将是一种轻量级,可嵌入的BPM引擎,而且 还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0, 以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和的BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项 目的是VMware的SpringSource分支,Alfresco的计划把该项目提交给 Apache基础架构,希望吸引更多方面的 BPM专家和促进BPM的创新。
3、一个简单的流程实例
基于activiti本身的api
然后通过processEngine获得activiti各项服务
3、一个简单的流程实例
(3)、发布一个流程(最直接的方法) 同时删除一个流程过程如下
(4)、获得所有流程定义
这将会获得所有已发布的流程实例信息,如key、id、名称等。 (5)、启动一个流程实例 通过流程定义的id启动

activiti工作流原理简单明了

activiti工作流原理简单明了

Activiti是一款开源的工作流引擎,用于实现业务流程的自动化和管理。

其工作原理可以简单概括如下:
流程定义:在Activiti中,首先需要定义业务流程,通常使用BPMN(Business Process Model and Notation)标准进行建模。

流程定义包括各个步骤、任务、决策点等,以及它们之间的关系和顺序。

流程部署:将流程定义部署到Activiti引擎中,可以通过配置文件或编程方式进行部署。

部署后,流程定义会被解析为可执行的流程实例。

流程实例化:当需要启动一个新的业务流程时,根据流程定义创建流程实例。

流程实例是流程定义的一个具体实例,包含了流程中的各个步骤和任务。

任务分配:在流程中,任务会被分配给不同的参与者或角色。

Activiti可以根据预先定义的规则和条件来分配任务,也可以根据实时的数据和流程情况进行动态分配。

任务执行:参与者可以根据任务的要求和流程定义的指导执行任务,完成相关操作和提交必要的数据。

流程控制:流程中的控制流会根据预先定义的条件和规则进行控制,决定流程的走向。

例如,根据条件分支选择不同的路径,或根据某些条件触发并行任务等。

监控和管理:Activiti提供了监控和管理工具,可以跟踪和监控流程实例的状态、任务的执行情况,以及进行流程的调度和管理。

通过以上的工作流原理,Activiti实现了对业务流程的可视化、自动化和管理,帮助组织和企业提升效率、降低成本,并实现更好的业务控制和可追溯性。

Activiti工作流入门详解完整教程

Activiti工作流入门详解完整教程

Activiti入门教程详解完整教程1.A ctiviti介绍Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。

Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss JBPM的项目架构师,它的特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。

1.1工作流引擎ProcessEngine对象,这是Activiti工作的核心。

负责生成流程运行时的各种实例及数据,监控和管理流程的运行。

1.2BPMN业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)2.准备环境2.1Activiti软件环境1)JDK1.6或者更高版本2)支持的数据库有:h2,mysql,oracle,mysql,db2等3)支持Activiti运行的jar包,可以通过maven依赖引入4)开发环境为Eclipse3.7或者以上版本,myeclipse为8.6版本2.2安装流程设计器(eclipse插件)1)打开Help →Install New Software →Add输入Name: Activiti DesignerLocation: /designer/update/输入完成后,单击OK按钮等待下载完成后安装。

安装完成后在菜单选项中会出现Activiti的目录选项2.3 设置eclipse activit插件的画流程图选项打开菜单Windows --> Preferences --> Activiti -->Save 下流程图片的生成方式勾选上Create process definition image when saving the diagram操作,勾选上这个操作后在画流程图后保存eclipse会自动生成对应的流程图片。

Activiti7精讲教程-Java通用型工作流开发实战

Activiti7精讲教程-Java通用型工作流开发实战

Activiti7精讲教程-Java通用型工作流开发实战
完整版11章,附源码
从0开始开发一个通用、好用、高效的UML工作流系统;项目代码手把手带着敲,没有无中生有的复制粘贴,每一行代码都有出处和依据;以主流前后端分离模式,手把手带你铸就黑马级全栈项目。

课程三大核心:① 以“代码驱动式”教学模式,精讲最新版工作流引擎Activiti7核心组件;② 传授你业务建模或者软件建模的“工程化思维”;③ 基于SpringBoot+Activiti+SpringSecurity 等技术栈,“手把手”带你设计与实战企业级的黑马项目:《通用型可视化UML 工作流系统》。

activiti工作流使用手册

activiti工作流使用手册

activiti工作流使用手册一、简介activiti是一个轻量级的Java开源工作流引擎,广泛应用于各类企业应用系统中。

本手册旨在为用户提供一份全面的activiti工作流使用指南,帮助用户快速上手并灵活应用activiti工作流。

二、安装与配置1. 下载activitiactiviti官网提供最新的稳定版本下载,在官网下载页面选择合适的版本,并解压到指定目录。

2. 导入activiti库在项目中导入activiti库,可以使用Maven或其他依赖管理工具,或者手动导入activiti相关的jar包。

3. 配置数据库activiti使用数据库来存储工作流相关的数据,需要配置数据库连接信息。

在项目的配置文件中,根据使用的数据库类型,配置相应的数据源。

4. 配置activiti核心引擎在项目的配置文件中,配置activiti核心引擎。

可以配置引擎的缓存设置、任务执行器等参数,以满足具体业务需求。

三、工作流定义1. 设计流程图使用activiti提供的流程图设计器,或者其他工具设计流程图。

流程图应包含各个环节、任务和流程流转条件。

2. 定义流程根据设计好的流程图,使用activiti提供的API编写Java代码来定义流程。

流程定义包括流程的启动、流程实例的创建、任务分配等。

四、工作流执行1. 启动流程使用activiti提供的API,启动流程实例。

根据流程定义的启动条件,可以设置流程实例的变量、业务参数等。

2. 处理任务根据流程的执行情况,系统将生成一系列待处理的任务。

使用activiti提供的API,查询并处理这些任务。

任务的处理包括任务的审批、任务的分派、任务的执行等。

3. 流程流转处理任务后,根据任务处理结果,流程会自动流转到下一个环节,或者根据设置的流转条件,执行流程中的分支和合并。

5. 监控流程在流程的执行过程中,可以使用activiti提供的监控工具,实时查看流程的执行情况,包括流程实例的状态、任务的处理情况、历史记录等。

优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含。。。

优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含。。。

优雅的实现Activiti动态调整流程(⾃由跳转、前进、后退、分裂、前加签、后加签等),含。

最近对Activiti做了⼀些深⼊的研究,对Activiti的流程机制有了些理解,对动态调整流程也有了⼀些实践⽅法。

现在好好总结⼀下,⼀来是对这段时间⾃⼰⾟苦探索的⼀个记录,⼆来也是为后来者指指路~~~如下内容准备采⽤QA的⽅式写,很多问题都是当初⾃⼰极疑惑的问题,希望能为⼤家解惑!Q:可以动态调整流程吗?A:可以!可以动态更改流程指向,或者创建新的节点,等等。

Q: 更改流程还需要注意什么?A: 必须要实现持久化!否则⼀旦应⽤重启,你的流程就犯糊涂了!譬如,你创建了⼀个新节点,但由于没有持久化,重启之后流程引擎找不到那个新节点了。

Q: 如何做到优雅?A: 除了持久化之外,还记住尽量不要因为临时调整直接更改现有活动(没准这个活动后⾯还要照常使⽤呢!),这种情况可以考虑克隆。

第三,不要直接操作数据库,或者SqlSession,记住⾃⼰写Command!参见我前⾯的。

如下代码⽰出执⾏某个activity后续流程的Cmd:public class CreateAndTakeTransitionCmd implements Command<ng.Void>{private ActivityImpl _activity;private String _executionId;public CreateAndTakeTransitionCmd(String executionId, ActivityImpl activity){_executionId = executionId;_activity = activity;}@Overridepublic Void execute(CommandContext commandContext){Logger.getLogger(TaskFlowControlService.class).debug(String.format("executing activity: %s", _activity.getId()));ExecutionEntity execution = commandContext.getExecutionEntityManager().findExecutionById(_executionId);execution.setActivity(_activity);execution.performOperation(AtomicOperation.TRANSITION_CREATE_SCOPE);return null;}}Q: 如何新建⼀个活动?A: 新建活动可以调⽤processDefinition.createActivity(newActivityId),我们往往可以以某个活动对象为模板来克隆⼀个新的活动,克隆的⽅法是分别拷贝各个字段的值:protected ActivityImpl cloneActivity(ProcessDefinitionEntity processDefinition, ActivityImpl prototypeActivity,String newActivityId, String... fieldNames){ActivityImpl clone = processDefinition.createActivity(newActivityId);CloneUtils.copyFields(prototypeActivity, clone, fieldNames);return clone;}拷贝字段的代码如下:import ng.reflect.FieldUtils;import org.apache.log4j.Logger;import org.junit.Assert;public abstract class CloneUtils{public static void copyFields(Object source, Object target, String... fieldNames){Assert.assertNotNull(source);Assert.assertNotNull(target);Assert.assertSame(source.getClass(), target.getClass());for (String fieldName : fieldNames){try{Field field = FieldUtils.getField(source.getClass(), fieldName, true);field.setAccessible(true);field.set(target, field.get(source));}catch (Exception e){Logger.getLogger(CloneUtils.class).warn(e.getMessage());}}}}⼀个⽰例的⽤法是:ActivityImpl clone = cloneActivity(processDefinition, prototypeActivity, cloneActivityId, "executionListeners","properties");这个语句的意思是克隆prototypeActivity对象的executionListeners和properties字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
点击Finish完成。
右键项目选择Properties,选择Project Facets 勾选上图中的选项,点击Apply,再点击OK
然后将项目转换成web项目,右键项目选择Properties,在Project Facets中做如下勾选,然后点击Appy应用和OK确定
然后右键项目Properties ,选择Deployment Assembly,将test相关目录Remove掉之保留main下面需要发布的内容,如下图
勾选上Create process definition image when saving the diagram操作,勾选上这个操作后在画流程图后保存eclipse会自动生成对应的流程图片。
准备开发环境
创建maven web项目,在maven中添加Activiti依赖
在eclipse左边工作栏右键New选择创建Maven Project项目,创建一个名为ActivitiTest的项目
Activiti
1.
Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。
Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss JBPM的项目架构师,它的特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。
1.1
ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据,监控和管理流程的运行。
1.2
业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version><scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
2.
2.1
1)或者更高版本
2)支持的数据库有:h2,mysql,oracle,mysql,db2等
3)支持Activiti运行的jar包,可以通过maven依赖引入
4)开发环境为或者以上版本,myeclipse为版本
安装流程设计器(eclipse插件)
1)打开HelpInstall New SoftwareAdd
<version></dependency>
</dependencies>
然后在命令行下mvn compile 编译当前项目,将需要的包下载到本地仓库
初始化数据库
1)src/main/resource目录下创建文件,内容如下
<xmlversion=""encoding="UTF-8">
<beansxmlns=""xmlns:xsi=""
xmlns:context=""xmlቤተ መጻሕፍቲ ባይዱs:tx=""
xmlns:jee=""xmlns:aop=""
xsi:schemaLocation=" ">
<beanid="processEngineConfiguration"
class="">
<propertyname="jdbcDriver"value=""/>
输入 Name: Activiti Designer
Location: designer/update/
输入完成后,单击OK按钮等待下载完成后安装。
安装完成后在菜单选项中会出现Activiti的目录选项
设置eclipse activit插件的画流程图 选项
打开菜单Windows --> Preferences --> Activiti -->Save 下流程图片的生成方式
然后点击Appply和OK
然后在文件中添加以下依赖
<dependencies>
<dependency>
<groupId></groupId>
<artifactId>Activiti-engine</artifactId>
<version></dependency>
<dependency>
<groupId></groupId>
<artifactId>Activiti-spring</artifactId>
<version></dependency>
<dependency>
<groupId><artifactId>groovy-all</artifactId>
<version></dependency>
<dependency>
<propertyname="jdbcUrl"value="jdbc:;characterEncoding=utf8"/>
<propertyname="jdbcUsername"value="root"/>
<propertyname="jdbcPassword"value="root"/>
<propertyname="databaseSchemaUpdate"value="true"/>
@Test
publicvoidcreateTable() {
ProcessEngineprocessEngine= ("")
</bean>
</beans>
jdbcUrl为你电脑数据库的url
jdbcUsername为数据库用户名
jdbcPassword为数据库密码
2)在main/java目录下创建任意目录和类
编写创建Activiti数据表方法
publicclassCreateTable {
/****
* 创建流程表
* */
<groupId></groupId>
<artifactId>slf4j-api</artifactId>
<version></dependency>
<dependency>
<groupId></groupId>
<artifactId>slf4j-jdk14</artifactId>
<version></dependency>
相关文档
最新文档