1. 程式人生 > 程式設計 >第五節:Activiti6.0——流程定義相關API

第五節: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);
複製程式碼
  1. 執行結果
    執行結果
  2. 檢視資料庫
    資料庫結果