工作流总结:
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统的目标:管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预。
ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。2)支持的数据库有:h2, mysql, oracle, postgres, mssql, db2等。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
activiti.cfg.xml(activiti的配置文件):Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。
各个Service的作用:
RepositoryService 管理流程定义//是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。
RuntimeService 执行管理,包括启动、推进、删除流程实例等操作//是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。
TaskService 任务管理//是activiti的任务服务类。可以从这个类中获取任务的信息。
HistoryService 历史管理(执行完的数据的管理)//是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
ManagerService
ProcessDefinition流程定义类。可以从这里获得资源文件等。
ProcessInstance流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。
ExecutionActiviti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。
总结:
* 一个流程中,执行对象可以存在多个,但是流程实例只能有一个。
* 当流程按照规则只执行一次的时候,那么流程实例就是执行对象。
Deployment 部署对象
1、一次部署的多个文件的信息。对于不需要的流程可以删除和修改。
2、对应的表:
act_re_deployment:部署对象表
act_re_procdef:流程定义表
act_ge_bytearray:资源文件表
act_ge_property:主键生成策略表
ProcessDefinition 流程定义
1、解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的。
Execution 执行对象
按流程定义的规则执行一次的过程.
对应的表:
act_ru_execution: 正在执行的信息
act_hi_procinst:已经执行完的历史流程实例信息
act_hi_actinst:存放历史所有完成的活动
ProcessInstance 流程实例
特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。
注意
(1)如果是单例流程,执行对象ID就是流程实例ID
(2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
(3)一个流程中,流程实例只有1个,执行对象可以存在多个。
Task 任务
执行到某任务环节时生成的任务信息。
对应的表:
act_ru_task:正在执行的任务信息
act_hi_taskinst:已经执行完的历史任务信息
在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表
由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对代办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给RuntimeService、TaskService管理,而历史数据交给HistoryService来管理。
这样做的好处在于,加快流程执行的速度,因为正在执行的流程的表中数据不会很大。
1、一个活动中可以指定一个或多个SequenceFlow(Start中有一个,End中没有)。
* 开始活动中有一个SequenceFlow 。
* 结束活动中没有SequenceFlow 。
* 其他活动中有1条或多条SequenceFlow
2、如果只有一个,则可以不使用流程变量设置codition的名称;
如果有多个,则需要使用流程变量设置codition的名称。message表示流程变量的名称,‘不重要’表示流程变量的值,${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。
1):结束节点没有出口
2):其他节点有一个或多个出口。
如果有一个出口,则代表是一个单线流程;
如果有多个出口,则代表是开启并发流程。
个人任务及三种分配方式:
1:在taskProcess.bpmn中直接写 assignee=“张三丰"
2:在taskProcess.bpmn中写 assignee=“#{userID}”,变量的值要是String的。
使用流程变量指定办理人
3,使用TaskListener接口,要使类实现该接口,在类中定义:
delegateTask.setAssignee(assignee);// 指定个人任务的办理人
使用任务ID和办理人重新指定办理人:
processEngine.getTaskService()//
.setAssignee(taskId, userId);
组任务及三种分配方式:
1:在taskProcess.bpmn中直接写 candidate-users=“小A,小B,小C,小D"
2:在taskProcess.bpmn中写 candidate-users =“#{userIDs}”,变量的值要是String的。
使用流程变量指定办理人
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userIDs", "大大,小小,中中");
3,使用TaskListener接口,使用类实现该接口,在类中定义:
//添加组任务的用户
delegateTask.addCandidateUser(userId1);
delegateTask.addCandidateUser(userId2);
组任务分配给个人任务(认领任务):
processEngine.getTaskService().claim(taskId, userId);
个人任务分配给组任务:
processEngine.getTaskService(). setAssignee(taskId, null);
向组任务添加人员:
processEngine.getTaskService().addCandidateUser(taskId, userId);
向组任务删除人员:
processEngine.getTaskService().deleteCandidateUser(taskId, userId);
个人任务和组任务存放办理人对应的表:
act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务
act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务
区别在于:如果是个人任务TYPE的类型表示participant(参与者)
如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)
代码实例:
1.导jar包
2、编写配置文件activiti.cfg.xml
3、画规则流程图.bpmn文件和.png图片
4、编码
public class HelloWorld {
//获取流程引擎
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//1、发布流程
@Test
public void publish(){
//获得上传文件的输入流程
InputStream resource = this.getClass().getClassLoader().getResourceAsStream("diagrams/Leave.zip");
ZipInputStream zipInputStream = new ZipInputStream(resource);
//获取仓库服务的实例
Deployment deploy = defaultProcessEngine.getRepositoryService()
.createDeployment()//创建部署对象
.name("helloworld入门程序2")
.addZipInputStream(zipInputStream)
//.addClasspathResource("diagrams/Leave.bpmn")
//.addClasspathResource("diagrams/Leave.png")
.deploy();//完成部署
System.out.println(deploy.getId()+"*****"+deploy.getName()+"***"+deploy.getDeploymentTime()+"**"+deploy.getCategory());
//1 helloworld入门程序
}
//删除流程
@Test
public void deleteDeployment(){
//删除发布信息
String deploymentId="1001";
//获取仓库服务对象
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//普通删除,如果当前规则下有正在执行的流程,则抛异常你
//repositoryService.deleteDeployment(deploymentId);
//级联删除,会删除和当前规则相关的所有信息,正在执行的信息,也包括历史信息
//相当于:repositoryService.deleteDeploymentCascade(deploymentId);
repositoryService.deleteDeployment(deploymentId, true);
}
//查看流程定义
@Test
public void queryProcessDefinition(){
List<ProcessDefinition> list = defaultProcessEngine.getRepositoryService().createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list();
for (ProcessDefinition processDefinition : list) {
System.out.println("id:"+processDefinition.getId());
System.out.println("name:"+processDefinition.getName());
System.out.println("key:"+processDefinition.getKey());
System.out.println("version:"+processDefinition.getVersion());
System.out.println("resourceName:"+processDefinition.getResourceName());
}
}
//查看流程状态
@Test
public void queryProcessState(){
String ProcessInstanceId="1401";
ProcessInstance r = defaultProcessEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(ProcessInstanceId).singleResult();
System.out.println(r);
if(r!=null){
System.out.println("当前流程在:"+r.getActivityId());
}else{
System.out.println("流程已结束");
}
}
//2、启动流程
@Test
public void start(){
ProcessInstance startP = defaultProcessEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
System.out.println("processId:"+startP.getId()+"***activityId:"+startP.getActivityId());
}
//processId:101***activityId:process1
//3、查看流程
@Test
public void queryTask(){
String banlizhe="张三";
List<Task> list = defaultProcessEngine.getTaskService()
.createTaskQuery()//创建任务查询对象
.taskAssignee(banlizhe)//指定个人任务办理人
.list();
for (Task task : list) {
System.out.println(task.getAssignee()+"-->"+task.getId()+"-->"+task.getName());
}
}
//张三-->104-->提交申请
//李四-->202-->【审批】部门经理
//王五-->302-->【审批】总经理
//4、办理任务
@Test
public void banliTask(){
String taskId="302";
defaultProcessEngine.getTaskService().complete(taskId);
System.out.println("完成任务");
}
}
工作流
最新推荐文章于 2022-10-22 23:59:13 发布