第五节:Activiti6.0——流程定义相关API

本人个人博客网站,欢迎访问:学教府

一、概述

介绍:在发布一次资源后,会生成对应的流程定义(存储在表act_re_procdef)中,该定义记录一个流程的信息,如下图所有:
流程定义

二、流程定义的发布生成

  1. 我们的资源只有bpmn文件时,发布后activiti会帮我们生成对应的流程图png。如下:
    bpmn
    在这里插入图片描述
  2. 我们可以自己添加png资源,此时activiti就不会帮我们生成。代码如下:
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    RepositoryService repositoryService = processEngine.getRepositoryService();
    
    DeploymentBuilder builder = repositoryService.createDeployment();
    
    //发布资源是自己的bpmn和png
    builder.addClasspathResource("test2.bpmn").addClasspathResource("test2.png");
    builder.deploy();
    
    processEngine.close();
    System.exit(0);
    

资源图片:
在这里插入图片描述
数据库中查看:
test2
注意匹配流程图的规则:

  • 优先查找与流程描述XML文件同名并且后缀为流程ID的图片文件
  • 如果根据第一条规则查找不到相应的流程图文件,那么就会查找与流程描述XML文件同名的图片文件

3.只发布bpmn文件,并且不加自己的png图片时,同时我们也不想activiti帮我们生成png时,只需要在activiti.cfg.xml配置文件中添加如下属性:

<!--该属性是在我们发布资源时,是否自动生成对应png流程图-->
<property name="createDiagramOnDeploy" value="false" />

三、流程定义的中止(使失效)和激活(使生效)

介绍:发布流程定义后,定义只是一个规则,我们去用的时候才会真正的生成实例。不过我们在生成实例之前可以对流程定义中止和激活,测试如下:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RepositoryService repositoryService = processEngine.getRepositoryService();

DeploymentBuilder builder = repositoryService.createDeployment().addClasspathResource("test3.bpmn");
Deployment deployment = builder.deploy();

//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//将流程定义中止(使流程定义不生效,即不能生成实例)
System.out.println("processDefinition的id:" + processDefinition.getId());
repositoryService.suspendProcessDefinitionById(processDefinition.getId());

RuntimeService runtimeService = processEngine.getRuntimeService();
//尝试生成一个流程实例
//因为流程定义被中止了,所有会报异常:
// Exception in thread "main" org.activiti.engine.ActivitiException: Cannot start process instance. Process definition My Process (id = myProcess_1:20:90003) is suspended
try {
    runtimeService.startProcessInstanceById(processDefinition.getId());
}catch (Exception e){
    e.printStackTrace();
}

//此处把流程定义再激活
repositoryService.activateProcessDefinitionById(processDefinition.getId());
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("实例:" + processInstance);


processEngine.close();
System.exit(0);

结果如下:

processDefinition的id:myProcess_1:25:102503
#失效后不能生成实例
org.activiti.engine.ActivitiException: Cannot start process instance. Process definition My Process (id = myProcess_1:25:102503) is suspended
	at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:67)
	at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:51)
	at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.createAndStartProcessInstance(StartProcessInstanceCmd.java:109)
.......
	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:39)
	at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceById(RuntimeServiceImpl.java:114)
	at com.xjf.test.Test3.main(Test3.java:37)
#重新激活后生成实例
实例:ProcessInstance[102504]

四、流程定义的权限控制(1)

介绍:流程定义发布后,我们可以对流程定义的使用进行权限控制。指定用户或用户组来使流程定义只能由对应的用户来使用(只有保存关系的作用,activiti不会主动进行权限控制)。可以使用repositoryService.createProcessDefinitionQuery().startableByUser()方法来查关系。

设置的代码如下

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//首先创建用户
IdentityService identityService = processEngine.getIdentityService();
User user = identityService.newUser(UUID.randomUUID().toString());
user.setFirstName("xu");
user.setLastName("xiaoming");
user.setPassword("123456");
identityService.saveUser(user);

//发布流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("test3.bpmn").deploy();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//给流程定义指定候选人
repositoryService.addCandidateStarterUser(processDefinition.getId(),user.getId());

//查询用户能使用流程定义,从act_ru_identitylink表中去查
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().startableByUser(user.getId()).list();
list.forEach(System.out::println);

processEngine.close();
System.exit(0);

结果:

ProcessDefinitionEntity[myProcess_1:26:105003]

数据库查看:
用户数据表(act_id_user)查看:
user
流程定义(act_re_procedef)查看:
流程定义

此时对应的关联关系会保存到表 act_ru_identitylink 中:
关联关系

五、流程定义的权限控制(2)

**介绍:**流程定义跟用户或用户组的权限关系会保存在act_ru_identitylink表中,不过Activiti不会对这些权限进行拦截或者检查,只能根据这些关系与查询条件,返回相应的符合要求的数据。下面测试为用户查流程定义流程定义查用户

  1. 编码:
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    IdentityService identityService = processEngine.getIdentityService();
    
    //发布资源
    Deployment deployment = repositoryService.createDeployment().addClasspathResource("test2.bpmn").deploy();
    
    //创建用户
    User user1 = identityService.newUser("9");
    user1.setFirstName("狗");
    user1.setLastName("狗");
    identityService.saveUser(user1);
    User user2 = identityService.newUser("10");
    user2.setFirstName("猫");
    user2.setLastName("猫");
    identityService.saveUser(user2);
    
    //创建用户组
    Group group1 = identityService.newGroup("12");
    group1.setName("权限测试组1");
    identityService.saveGroup(group1);
    Group group2 = identityService.newGroup("13");
    group2.setName("权限测试组2");
    identityService.saveGroup(group2);
    
    //获取流程定义
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
    
    //给流程定义设置权限用户和用户组
    repositoryService.addCandidateStarterUser(processDefinition.getId(),user1.getId());
    repositoryService.addCandidateStarterUser(processDefinition.getId(),user2.getId());
    repositoryService.addCandidateStarterGroup(processDefinition.getId(),group1.getId());
    repositoryService.addCandidateStarterGroup(processDefinition.getId(),group2.getId());
    
    //1. 根据用户查询有权限的流程定义
    List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery().startableByUser(user1.getId()).list();
    System.out.println(user1.getFirstName() + user1.getLastName() + " 用户有权限的定义如下:");
    processDefinitionList.forEach(pf -> System.out.println(pf.getName()));
    
    System.out.println("===================================分隔符==============================");
    
    //2. 根据流程定义查询具有其权限的用户
    List<User> userList = identityService.createUserQuery().potentialStarter(processDefinition.getId()).list();
    System.out.println("具有流程定义 " + processDefinition.getName() +" 的用户如下");
    userList.forEach(user -> System.out.println(user.getFirstName() + user.getLastName()));
    
    System.out.println("===================================分隔符==============================");
    
    //3. 根据流程定义查询具有其权限的用户组
    List<Group> groupList = identityService.createGroupQuery().potentialStarter(processDefinition.getId()).list();
    System.out.println("具有流程定义 " + processDefinition.getName() +" 的用户组如下");
    groupList.forEach(group -> System.out.println(group.getName()));
    
    //关闭
    processEngine.close();
    System.exit(0);
    
  2. 运行结果
    运行结果
  3. 查看数据库
    数据库结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值