第五節:Activiti6.0——流程定義相關API
阿新 • • 發佈:2020-06-24
一、概述
介紹:在釋出一次資源後,會生成對應的流程定義(儲存在表act_re_procdef)中,該定義記錄一個流程的資訊,如下圖所有:
二、流程定義的釋出生成
- 我們的資源只有bpmn檔案時,釋出後activiti會幫我們生成對應的流程圖png。如下:
- 我們可以自己新增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);
複製程式碼
資源圖片:
資料庫中檢視: 注意匹配流程圖的規則:- 優先查詢與流程描述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==)檢視:
流程定義(==act_re_procedef==)檢視:此時對應的關聯關係會儲存到表 ==act_ru_identitylink== 中:
五、流程定義的許可權控制(2)
**介紹:**流程定義跟使用者或使用者組的許可權關係會儲存在act_ru_identitylink表中,不過Activiti不會對這些許可權進行攔截或者檢查,只能根據這些關係與查詢條件,返回相應的符合要求的資料。下面測試為==使用者查流程定義==和==流程定義查使用者==:
- 編碼:
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);
複製程式碼
- 執行結果
- 檢視資料庫