经过几年的学习,现在才感觉,了解源码是多么的重要,甚至如今火热的培训班的老师也是这样过来的吧!一点一点的分析源码,再加上一点一点的思考和总结,才能够对知识了解的那么深刻吧!原来学习就是如此的简单。
废话不多说了,本篇博客,来详解一下Activiti中有关Task任务的API。
任务的增删改
在Activiti中有关任务对象的增删改与之前讲解的用户或者用户组的增删改,都是一样的,看一下用到的方法
Task newTask();
Task newTask(String taskId);
void saveTask(Task task);
void deleteTask(String taskId);
void deleteTasks(Collection
taskIds); void deleteTask(String taskId, boolean cascade);
void deleteTasks(Collection
taskIds, boolean cascade); void deleteTask(String taskId, String deleteReason);
void deleteTasks(Collection
taskIds, String deleteReason);
基本上TaskService接口中关于任务的增删改的就这么多,英文差不多的就可以看懂上面方法是什么意思了,就不多解释了,直接来一个Demo尝一下鲜吧
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 ids = new ArrayList();
ids.add("3");
ids.add("4");
taskService.deleteTasks(ids);
//删除多个task(包括历史数据和子任务)
ids = new ArrayList();
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);
}
}
任务权限的设置
经过上面那些方法一折腾,任务总算是创建出来了,那么任务最终还是人来做的哈,如何来分配任务呢?看一下又有什么好玩的方法
//根据任务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来尝尝鲜吧!
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();
}
}
任务参数
在任务分配或者传递过程中,避免不了需要一些参数的传递,比如我们请假的时候,有请假人和请假天数吧!在Activiti中,参数类型分为流程参数和任务参数。老规矩,看一下用到的方法吧!
void setVariable(String taskId, String variableName, Object value);
void setVariables(String taskId, Map
variables); void setVariableLocal(String taskId, String variableName, Object value);
void setVariablesLocal(String taskId, Map
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
getVariables(String taskId); Map
getVariablesLocal(String taskId); Map
getVariables(String taskId, Collection variableNames); Map
getVariablesLocal(String taskId, Collection variableNames); void removeVariable(String taskId, String variableName);
void removeVariableLocal(String taskId, String variableName);
void removeVariables(String taskId, Collection
variableNames); void removeVariablesLocal(String taskId, Collection
variableNames);
哇塞,满满的全是正能量哈,这么多,Activiti封装的太贴心了,在这里需要补充一点知识。在Activiti中设置的参数是有作用域概念的,上面方法中没有带Local的,代表的是全局的作用域,带Local的表明的是当前任务的作用域。
下面就通过实战来了解一下吧
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);
}
}
任务附件管理
在一些流程中,有时候也会附带一些附件,在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
getTaskAttachments(String taskId); List
getProcessInstanceAttachments(String processInstanceId); void deleteAttachment(String attachmentId);
上面的方法中,基本上就是围绕附件的一些添加删除和查询的方法,都老一套了,没什么新鲜的了,按照老规矩,给个例子锻炼一下吧
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);
}
}
任务评论
在日常的工作流程中,有时候随着业务的进行,可能会夹杂着一些个人的流程意见。使用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
上面就是关于评论的一些操作方法,是不是感觉So easy呢?
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 comments = taskService.getTaskComments(task.getId());
System.out.println("评论数量:" + comments.size());
}
}