经过几年的学习,现在才感觉,了解源码是多么的重要,甚至如今火热的培训班的老师也是这样过来的吧!一点一点的分析源码,再加上一点一点的思考和总结,才能够对知识了解的那么深刻吧!原来学习就是如此的简单。
废话不多说了,本篇博客,来详解一下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