《Activiti工作流框架》专题-Activiti工作流框架监听器(listener)

Posted IT-老牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Activiti工作流框架》专题-Activiti工作流框架监听器(listener)相关的知识,希望对你有一定的参考价值。

文章目录

1.监听器概述

在流程中我们有时会对整个流程或者一个节点的某种状态做出相应的处理。这时就会用到监听器。
在Activiti中流程的监听主要分为两大类,执行监听器任务监听器

2.执行监听器(ExecutionListener)

执行监听器可以执行外部java代码或执行表达式,当流程定义中发生了某个事件。 可以出触发…

监听流程实例的事件

第一步:按照框架的规则编写监听器类

配置监听器,XML代码如下:

说明:

任务监听器支持以下属性:

event(必选):任务监听器会被调用的任务类型。 可能的类型为:
start:流程节点创建后触发。
end:当任务完成,并尚未从运行数据中删除时触发。

创建监听器类
class:必须调用的代理类。 这个类必须实现org.activiti.engine.delegate. ExecutionListener接口。实现类代码如下:

/**
 * 自定义一个执行监听器
 */
public class MyExecutionListener1 implements ExecutionListener 

	/**
	 * 当监听的事件发送时,会自动触发该方法
	 */
	@Override
	public void notify(DelegateExecution execution) throws Exception 
		System.out.println("MyExecutionListener1-自定义的监听器执行了~");
	
	


/**
 * 自定义一个执行监听器
 */
public class MyExecutionListener2 implements ExecutionListener 

	/**
	 * 当监听的事件发送时,会自动触发该方法
	 */
	@Override
	public void notify(DelegateExecution execution) throws Exception 
		System.out.println("MyExecutionListener2-自定义的监听器执行了~");
	



 测试执行监听器

/**
 * 执行监听器测试
 */
public class ExecutionListenerTest 

	ProcessEngine pe = null;

	@Before
	public void init() 
		pe = ProcessEngines.getDefaultProcessEngine();
	

	/**
	 * 01-部署流程定义
	 */
	@Test
	public void test1() 
		DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
		deploymentBuilder.addClasspathResource("com/activiti/listenner/ExecutionListenner.bpmn");
		deploymentBuilder.addClasspathResource("com/activiti/listenner/ExecutionListenner.png");
		Deployment deployment = deploymentBuilder.deploy();
		System.out.println("流程定义部署成功...");
	

	/**
	 * 02-查询流程定义列表
	 */
	@Test
	public void test2() 
		// 流程定义查询对象,用于查询表act_re_procdef
		ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
		// 添加排序条件
		query.orderByProcessDefinitionVersion().desc();
		// 添加分页查询
		query.listPage(0, 10);
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) 
			System.out.println(pd.getId() + "--" + pd.getName() + "--key:" + pd.getKey());
		
	

	/**
	 * 03-启动流程实例
	 */
	@Test
	public void test3() 
		String processDefinitionId = "myProcess:3:85004";
		pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
		System.out.println("流程实例定义启动成功.....");
	
	
	/**
	 * 04-查询个人任务列表
	 */
	@Test
	public void test7() 
		TaskQuery query = pe.getTaskService().createTaskQuery();
		String assignee = "Mary";
		query.taskAssignee(assignee);
		List<Task> list = query.list();
		for (Task task : list) 
			System.out.println("待办任务ID:"+task.getId());
			System.out.println("待办任务名称:"+task.getName());
			System.out.println("任务创建时间:"+task.getCreateTime());
			System.out.println("任务办理人:"+task.getAssignee());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			Map<String, Object> map = task.getProcessVariables();
			Set<Entry<String, Object>> entrySet = map.entrySet();
			for (Entry<String, Object> entry : entrySet) 
				System.out.println(entry.getKey());
				System.out.println(entry.getValue());
			
		
	

	/**
	 * 04-办理个人任务
	 */
	@Test
	public void test4() 
		String taskId = "90002";
		pe.getTaskService().complete(taskId);
		System.out.println("任务办理成功....");
	


3.任务监听器(TaskListener)

任务监听器可以在发生对应的任务相关事件时执行自定义java逻辑 或表达式。

任务监听器只能添加到流程定义中的用户任务中。在之前任务节点上添加任务监听:

监听任务事件

第一步:按照activiti框架的规则编写一个任务监听器类

/**
 * 自定义任务监听器
 */
public class MyTaskListener1 implements TaskListener 

	@Override
	public void notify(DelegateTask delegateTask) 
		String assignee = delegateTask.getAssignee();
		String eventName = delegateTask.getEventName();
		System.out.println("事件名称:"+eventName);
		String name = delegateTask.getName();
		String processInstanceId = delegateTask.getProcessInstanceId();
		System.out.println("进程实例ID:"+processInstanceId);
		Set<String> variableNames = delegateTask.getVariableNames();
		for (String key : variableNames) 
			Object value = delegateTask.getVariable(key);
			System.out.println(key + " = " + value);
		
		System.out.println("MyTaskListener1:一个任务[" + name + "]被创建了,由[" + assignee + "]负责办理");
	


/**
 * 自定义任务监听器
 */
public class MyTaskListener2 implements TaskListener 

	@Override
	public void notify(DelegateTask delegateTask) 
		String assignee = delegateTask.getAssignee();
		String eventName = delegateTask.getEventName();
		System.out.println("事件名称:"+eventName);
		String name = delegateTask.getName();
		String processInstanceId = delegateTask.getProcessInstanceId();
		System.out.println("进程实例ID:"+processInstanceId);
		Set<String> variableNames = delegateTask.getVariableNames();
		for (String key : variableNames) 
			Object value = delegateTask.getVariable(key);
			System.out.println(key + " = " + value);
		
		System.out.println("MyTaskListener2:一个任务[" + name + "]被创建了,由[" + assignee + "]负责办理");
	


第二步:注册监听类

说明:
1.任务监听器支持以下属性:
event(必选):任务监听器会被调用的任务类型。 可能的类型为:

	create:任务创建并设置所有属性后触发。
	assignment:任务分配给一些人时触发。 当流程到达userTask,assignment事件 会在create事件之前发生。
	complete:当任务完成,并尚未从运行数据中删除时触发。

新添加的任务监听包裹在executionListener监听的内部,顺序为:execution Start--> task Assignment-->task Create-->task Complete-->execution End

第三步:办理任务,由框架通过反射调用监听器类

/**
 * 任务监听器测试
 */
public class TaskListenerTest 

	ProcessEngine pe = null;

	@Before
	public void init() 
		pe = ProcessEngines.getDefaultProcessEngine();
	
	
	/**
	 * 01-部署流程定义
	 */
	@Test
	public void test1() 
		DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
		deploymentBuilder.addClasspathResource("com/activiti/listenner/task/TaskListenner.bpmn");
		deploymentBuilder.addClasspathResource("com/activiti/listenner/task/TaskListenner.png");
		Deployment deployment = deploymentBuilder.deploy();
		System.out.println("流程定义部署成功...");
	
	

	/**
	 * 02-查询流程定义列表
	 */
	@Test
	public void test2() 
		// 流程定义查询对象,用于查询表act_re_procdef
		ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
		// 添加排序条件
		query.orderByProcessDefinitionVersion().desc();
		// 添加分页查询
		query.listPage(0, 10);
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) 
			System.out.println(pd.getId() + "--" + pd.getName() + "--key:" + pd.getKey());
		
	
	
	/**
	 * 03-启动流程实例
	 */
	@Test
	public void test3()
		String processDefinitionId = "TaskListennerTest:1:95004";
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("key1", "v1");
		variables.put("k2", 300);
		pe.getRuntimeService().startProcessInstanceById(processDefinitionId , variables);
		System.out.println("流程实例启动成功.....");
	
	
	/**
	 * 04-查询个人任务列表
	 */
	@Test
	public void test7() 
		TaskQuery query = pe.getTaskService().createTaskQuery();
		String assignee = "小李";
		query.taskAssignee(assignee);
		List<Task> list = query.list();
		for (Task task : list) 
			System.out.println("待办任务ID:"+task.getId());
			System.out.println("待办任务名称:"+task.getName());
			System.out.println("任务创建时间:"+task.getCreateTime());
			System.out.println("任务办理人:"+task.getAssignee());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			Map<String, Object> map = task.getProcessVariables();
			Set<Entry<String, Object>> entrySet = map.entrySet();
			for (Entry<String, Object> entry : entrySet) 
				System.out.println(entry.getKey());
				System.out.println(entry.getValue());
			
		
	
	
	/**
	 * 办理任务
	 */
	@Test
	public void test8()
		String taskId = "97506";
		pe.getTaskService().complete(taskId );
	


以上是关于《Activiti工作流框架》专题-Activiti工作流框架监听器(listener)的主要内容,如果未能解决你的问题,请参考以下文章

工作流引擎Activiti的使用进阶!详细分析工作流框架中高级功能的使用示例

工作流Activiti框架中LDAP组件详细解析!实现对工作流目录信息的访问控制

技术干货,如何使用Activiti快速开发《Activiti用户手册》高清版

Activiti工作流笔记

工作流引擎Activiti 专题

001 activiti环境