Activiti入門教程八(玩轉Task任務API)
經過幾年的學習,現在才感覺,瞭解原始碼是多麼的重要,甚至如今火熱的培訓班的老師也是這樣過來的吧!一點一點的分析原始碼,再加上一點一點的思考和總結,才能夠對知識瞭解的那麼深刻吧!原來學習就是如此的簡單。
廢話不多說了,本篇部落格,來詳解一下Activiti中有關Task任務的API。
任務的增刪改
在Activiti中有關任務物件的增刪改與之前講解的使用者或者使用者組的增刪改,都是一樣的,看一下用到的方法
Task newTask();
Task newTask(String taskId);
void saveTask(Task task);
void deleteTask(String taskId);
void deleteTasks(Collection<String> taskIds);
void deleteTask(String taskId, boolean cascade);
void deleteTasks(Collection<String> taskIds, boolean cascade);
void deleteTask(String taskId, String deleteReason);
void deleteTasks(Collection<String> taskIds, String deleteReason);
基本上TaskService介面中關於任務的增刪改的就這麼多,英文差不多的就可以看懂上面方法是什麼意思了,就不多解釋了,直接來一個Demo嘗一下鮮吧
<span style="font-family:Comic Sans MS;font-size:18px;">public class DeleteTask { public static void main(String[] args) { // 建立流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); //獲取任務服務元件 TaskService taskService = engine.getTaskService(); // 儲存若干個Task for (int i = 1; i < 10; i++) { saveTask(taskService, String.valueOf(i)); } // 刪除task(不包括歷史資料和子任務) taskService.deleteTask("1"); // 刪除task(包括歷史資料和子任務) taskService.deleteTask("2", true); // 刪除多個task(不包括歷史資料和子任務) List<String> ids = new ArrayList<String>(); ids.add("3"); ids.add("4"); taskService.deleteTasks(ids); //刪除多個task(包括歷史資料和子任務) ids = new ArrayList<String>(); ids.add("5"); ids.add("6"); taskService.deleteTasks(ids, true); // 再刪除ID為3的task,此時3的歷史資料也會被刪除(如果有的話) taskService.deleteTask("3", true); } //儲存一個task static void saveTask(TaskService taskService, String id) { Task task1 = taskService.newTask(id); taskService.saveTask(task1); }}</span>
任務許可權的設定
經過上面那些方法一折騰,任務總算是創建出來了,那麼任務最終還是人來做的哈,如何來分配任務呢?看一下又有什麼好玩的方法
//根據任務ID和使用者ID,然後繫結到一塊
void addCandidateUser(String taskId, String userId);
//把任務ID和使用者組繫結到一塊
void addCandidateGroup(String taskId, String groupId);
//不僅繫結到一塊,並設定繫結的型別
void addUserIdentityLink(String taskId, String userId, String identityLinkType);
void addGroupIdentityLink(String taskId, String groupId, String identityLinkType);
//刪除操作
void deleteCandidateUser(String taskId, String userId);
void deleteCandidateGroup(String taskId, String groupId);
void deleteUserIdentityLink(String taskId, String userId, String identityLinkType);
void deleteGroupIdentityLink(String taskId, String groupId, String identityLinkType);
//根據任務id和使用者id設定任務受理人
void setAssignee(String taskId, String userId);
//根據使用者id和任務id設定任務持有人
void setOwner(String taskId, String userId);
上面就是TaskService中有關任務分配的所有方法,看一眼,有木有感覺很簡單呢?確實是這樣,在分享一個demo來嚐嚐鮮吧!
<span style="font-family:Comic Sans MS;font-size:18px;">public class SetOwner { public static void main(String[] args) { // 獲取流程引擎例項 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 獲取身份服務元件 IdentityService identityService = engine.getIdentityService(); // 新建使用者 User user = creatUser(identityService, "user1", "張三", "last", "[email protected]", "123"); // 獲取任務服務元件 TaskService taskService = engine.getTaskService(); // 儲存一個Task Task task1 = taskService.newTask("task1 "); task1.setName("申請任務"); taskService.saveTask(task1); // 設定任務持有人 taskService.setOwner(task1.getId(), user.getId()); System.out .println("使用者張三持有任務數量:" + taskService.createTaskQuery().taskOwner(user.getId()) .count()); } // 建立使用者方法 static User creatUser(IdentityService identityService, String id, String first, String last, String email, String passwd) { // 使用newUser方法建立User例項 User user = identityService.newUser(id); // 設定使用者的各個屬性 user.setFirstName(first); user.setLastName(last); user.setEmail(email); user.setPassword(passwd); // 使用saveUser方法儲存使用者 identityService.saveUser(user); return identityService.createUserQuery().userId(id).singleResult(); }}</span>
任務引數
在任務分配或者傳遞過程中,避免不了需要一些引數的傳遞,比如我們請假的時候,有請假人和請假天數吧!在Activiti中,引數型別分為流程引數和任務引數。老規矩,看一下用到的方法吧!
void setVariable(String taskId, String variableName, Object value);
void setVariables(String taskId, Map<String, ? extends Object> variables);
void setVariableLocal(String taskId, String variableName, Object value);
void setVariablesLocal(String taskId, Map<String, ? extends Object> variables);
Object getVariable(String taskId, String variableName);
boolean hasVariable(String taskId, String variableName);
Object getVariableLocal(String taskId, String variableName);
boolean hasVariableLocal(String taskId, String variableName);
Map<String, Object> getVariables(String taskId);
Map<String, Object> getVariablesLocal(String taskId);
Map<String, Object> getVariables(String taskId, Collection<String> variableNames);
Map<String, Object> getVariablesLocal(String taskId, Collection<String> variableNames);
void removeVariable(String taskId, String variableName);
void removeVariableLocal(String taskId, String variableName);
void removeVariables(String taskId, Collection<String> variableNames);
void removeVariablesLocal(String taskId, Collection<String> variableNames);
哇塞,滿滿的全是正能量哈,這麼多,Activiti封裝的太貼心了,在這裡需要補充一點知識。在Activiti中設定的引數是有作用域概念的,上面方法中沒有帶Local的,代表的是全域性的作用域,帶Local的表明的是當前任務的作用域。
下面就通過實戰來了解一下吧
<span style="font-family:Comic Sans MS;font-size:18px;">public class LocalVariable { public static void main(String[] args) { // 獲取流程引擎例項 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 獲取任務服務元件 TaskService taskService = engine.getTaskService(); // 獲取執行服務元件 RuntimeService runtimeService = engine.getRuntimeService(); // 流程儲存服務元件 RepositoryService repositoryService = engine.getRepositoryService(); // 部署流程描述檔案 Deployment dep = repositoryService.createDeployment() .addClasspathResource("bpmn/vacation.bpmn").deploy(); // 查詢流程定義 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .deploymentId(dep.getId()).singleResult(); // 啟動流程 ProcessInstance pi = runtimeService .startProcessInstanceById(pd.getId()); // 分別呼叫setVariable和setVariableLocal方法 Task task = taskService.createTaskQuery().processInstanceId(pi.getId()) .singleResult(); taskService.setVariable(task.getId(), "days", 10); taskService.setVariableLocal(task.getId(), "target", "歐洲"); // 獲取引數 Object data1 = taskService.getVariable(task.getId(), "days"); System.out.println("獲取休假天數:" + data1); Object data2 = taskService.getVariable(task.getId(), "target"); System.out.println("獲取目的地: " + data2); // 獲取引數 Object data3 = taskService.getVariableLocal(task.getId(), "days"); System.out.println("使用getVariableLocal方法獲取天數:" + data3); }}</span>
任務附件管理
在一些流程中,有時候也會附帶一些附件,在Activiti中也為我們封裝好了上傳附件的API
Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String attachmentName, String attachmentDescription, InputStream content);
Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String attachmentName, String attachmentDescription, String url);
void saveAttachment(Attachment attachment);
Attachment getAttachment(String attachmentId);
InputStream getAttachmentContent(String attachmentId);
List<Attachment> getTaskAttachments(String taskId);
List<Attachment> getProcessInstanceAttachments(String processInstanceId);
void deleteAttachment(String attachmentId);
上面的方法中,基本上就是圍繞附件的一些新增刪除和查詢的方法,都老一套了,沒什麼新鮮的了,按照老規矩,給個例子鍛鍊一下吧
<span style="font-family:Comic Sans MS;font-size:18px;">public class CreateAttachment { public static void main(String[] args) throws Exception { // 獲取流程引擎例項 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 獲取任務服務元件 TaskService taskService = engine.getTaskService(); // 獲取執行服務元件 RuntimeService runtimeService = engine.getRuntimeService(); // 流程儲存服務元件 RepositoryService repositoryService = engine.getRepositoryService(); // 部署流程描述檔案 Deployment dep = repositoryService.createDeployment() .addClasspathResource("bpmn/vacation.bpmn").deploy(); // 查詢流程定義 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .deploymentId(dep.getId()).singleResult(); // 啟動流程 ProcessInstance pi = runtimeService .startProcessInstanceById(pd.getId()); // 查詢任務 Task task = taskService.createTaskQuery().processInstanceId(pi.getId()) .singleResult(); // 設定任務附件 taskService.createAttachment("web url", task.getId(), pi.getId(), "163.com", "163 web page", "http://www.163.com"); // 建立圖片輸入流 InputStream is = new FileInputStream(new File("resource/artifact/result.png")); // 設定輸入流為任務附件 taskService.createAttachment("web url", task.getId(), pi.getId(), "163.com", "163 web page", is); }}</span>
任務評論
在日常的工作流程中,有時候隨著業務的進行,可能會夾雜著一些個人的流程意見。使用Activiti可以將任務或者流程的評論儲存到ACT_HI_COMMENT表中,再來看一下吧!
Comment addComment(String taskId, String processInstanceId, String message);
Comment getComment(String commentId);
void deleteComments(String taskId, String processInstanceId);
void deleteComment(String commentId);
List<Comment> getTaskComments(String taskId);
上面就是關於評論的一些操作方法,是不是感覺So easy呢?
<span style="font-family:Comic Sans MS;font-size:18px;">public class AddComment { public static void main(String[] args) { // 獲取流程引擎例項 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 獲取任務服務元件 TaskService taskService = engine.getTaskService(); // 獲取執行服務元件 RuntimeService runtimeService = engine.getRuntimeService(); // 流程儲存服務元件 RepositoryService repositoryService = engine.getRepositoryService(); // 部署流程描述檔案 Deployment dep = repositoryService.createDeployment() .addClasspathResource("bpmn/vacation.bpmn").deploy(); // 查詢流程定義 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .deploymentId(dep.getId()).singleResult(); // 啟動流程 ProcessInstance pi = runtimeService .startProcessInstanceById(pd.getId()); // 查詢任務 Task task = taskService.createTaskQuery().processInstanceId(pi.getId()) .singleResult(); // 新增任務評論 taskService.addComment(task.getId(), pi.getId(), "this is comment message"); // 查詢評論 List<Comment> comments = taskService.getTaskComments(task.getId()); System.out.println("評論數量:" + comments.size()); }}</span>
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow