Activiti工作流

一.核心接口

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");
	}
}