一.核心接口
1.ProcessEngine 流程引擎
/**
*流程引擎 核心接口
*public class ProcessEngineImpl implements ProcessEngine 该类为线程安全类
*/
public interface ProcessEngine {
.......
RepositoryService getRepositoryService();
RuntimeService getRuntimeService();
FormService getFormService();
TaskService getTaskService();
HistoryService getHistoryService();
IdentityService getIdentityService();
ManagementService getManagementService();
DynamicBpmnService getDynamicBpmnService();
ProcessEngineConfiguration getProcessEngineConfiguration();
FormRepositoryService getFormEngineRepositoryService();
org.activiti.form.api.FormService getFormEngineFormService();
}
常用接口
2.RepositoryService 存储服务
主要负责工作流的存储相关操作,包括部署 删除等
public interface RepositoryService {
//创建部署
DeploymentBuilder createDeployment();
//流程定义查询
ProcessDefinitionQuery createProcessDefinitionQuery();
//部署查询
DeploymentQuery createDeploymentQuery();
//暂停流程
void suspendProcessDefinitionById(String processDefinitionId);
//启用流程
void activateProcessDefinitionById(String processDefinitionId);
......
}
3.RuntimeService 运行服务
主要负责通过流程定义启动一个流程实例 包括启动 终止流程实例等操作
public interface RuntimeService {
//通过流程定义启动一个流程 返回一个流程实例
ProcessInstance startProcessInstanceById(String processDefinitionId);
// 使用流程实例id 删除一个正在进行中的流程
void deleteProcessInstance(String processInstanceId, String deleteReason/*删除原因*/);
//创建流程实例查询对象
ProcessInstanceQuery createProcessInstanceQuery();
......
}
4.TaskService 任务服务
主要负责流程中的每一个任务的操作 ,包括 任务查询 ,任务指定受理人,任务拾取 归还, 完成任务 等操作
public interface TaskService {
//删除任务
void deleteTask(String taskId, String deleteReason);
//指定用户拾取该任务 不同于 setAssignee(String, String) 直接指定 这里会在有受理人的情况下进行校验
void claim(String taskId, String userId);
//指定任务为无人拾取
void unclaim(String taskId);
//完成一个任务
void complete(String taskId);
......
}
5.HistoryService 历史服务
主要负责历史流程 任务的查询等操作
public interface HistoryService {
//历史完成流程查询
HistoricProcessInstanceQuery createHistoricProcessInstanceQuery();
//历史任务查询
HistoricTaskInstanceQuery createHistoricTaskInstanceQuery();
//删除历史任务
void deleteHistoricTaskInstance(String taskId);
//删除历史流程
void deleteHistoricProcessInstance(String processInstanceId);
......
}
*NOTE 还有其他接口在ProcessEngine下面
流程配置ProcessEngineConfiguration
看名字就知道该类为流程引擎的一个配置类,其中包括各个服务接口的创建,创建数据库表的配置包括DB_SCHEMA_UPDATE_FALSE,DB_SCHEMA_UPDATE_TRUE,DB_SCHEMA_UPDATE_CREATE_DROP 数据源配置等 ,在和spring一起使用是在依赖了activiti-spring时 会使用SpringProcessEngineConfiguration类作为实现,流程引擎processengine的创建会通过buildProcessEngine()方法进行创建。
/**不更新*/
public static final String DB_SCHEMA_UPDATE_FALSE = "false";=
/**跟随流程引擎启动创建 流程引擎销毁时删除*/
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";
/** 更新*/
public static final String DB_SCHEMA_UPDATE_TRUE = "true";
二.使用
activiti使用需要部署流程图 ,该流程图规定为一个bmpn文件,eclipse可安装绘制流程图的工具。 如下图安装即可 。 会在创建文件处有创建activiti的选项。
Name: Activiti BPMN 2.0 designer
Location:http://activiti.org/designer/update/
1.绘制流程图
从右侧拖入控件,填写需要的uel表达式 ,保存就好了。保存好的bmpn文件用于部署使用 ,其实质上是一个xml文件,其中包括各种控件的信息 位置等数据。
*NOTE: uel表达式受理人只能指定一个 ,在候选人和候选人组 可以设置多个 使用逗号隔开 例如:传入的内容时 user1,user2,user3,…. 这样的
在流程图中直接指定办理人的方式十分的不灵活,所以多数会使用uel表达式或者监听器方式为任务指定受理人。任务完成主要通过任务id即可完成,那么我们则需要使用受理人 候选人 ,或者候选人组拾取任务的方式,使用确定的受理人来查询任务获取任务id,以确定完成的任务是有受理人的。
2.uel指定受理人
如图 ,指定了uel表达式 assignee1 假设传入用户A为该任务的受理人 ,那么我们则需要使用A来获取该任务id 再完成任务。
//启动流程时传入参数 指定assignee1 是A
Map<String,Object> variables=new HashMap<String ,Object>();
var.put("assignee1", "A");
var.put("candidateusers", "candidateuser1,candidateuser2");
var.put("candidategroups", "Mycandidategroup");
ProcessInstance processInstance= runtimeService.startProcessInstanceById("ProcessDefinitionid",variables);
///////////////////////////////////////////
// 指定受理人查询 li例如A
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(user)
.singleResult();
if (task == null) {
// 指定候选人查询 candidateuser1和candidateuser2都可以查到该任务
task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskCandidateUser(user)
.singleResult();
if (task == null) {
// 指定候选人组查询 Mycandidategroup 通过组获取任务
task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskCandidateGroup(group)
.singleResult();
}
if (task != null)
//任务拾取 需要任务拾取 ,即指定明确的受理人
taskService.claim(task.getId(), user);
}
if (task == null) {
return;
}
taskService.complete(task.getId(), map);
3.监听器方式指定受理人
创建一个流程,在这个流程中为其中一个任务添加一个监听器,指定该监听器是在任务创建时候触发,如图,我们启动流程,这里是在流程启动后直接常见后续的任务,所以可以,该监听器被触发,为该任务设定指定的受理人用户A。后续即可通过该受理人找到该任务并完成 ,当然,不止可以添加受理人,删除 添加候选人 候选人组 以及向流程中添加变量都是可以的。
public class MyTaskListener implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("A");
}
}