"Activiti Workflow Framework" topic (7)-Activiti workflow framework listener (listener)

1. Listener overview

In the process, we sometimes deal with the whole process or a certain state of a node accordingly. The listener will be used at this time.
The monitoring of the process in Activiti is mainly divided into two categories, 执行监听器and 任务监听器.

2. Execution Listener (ExecutionListener)

The execution listener can execute external java code or execute expressions when an event occurs in the process definition. Can be triggered...

Monitor the events of the process instance

Step 1 : Write the listener class according to the rules of the framework.
Insert picture description here
Configure the listener. The XML code is as follows:
Insert picture description here
Description:

The task listener supports the following attributes:

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

Create a listener class
class : a proxy class that must be called. This class must implement the org.activiti.engine.delegate. ExecutionListenerinterface. The implementation code is as follows:

/**
 * 自定义一个执行监听器
 */
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-自定义的监听器执行了~");
	}

}

 Test execution listener

/**
 * 执行监听器测试
 */
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. Task Listener (TaskListener)

The task listener can execute custom java logic or expressions when corresponding task-related events occur.

Task listeners can only be added to user tasks in the process definition. Add task monitoring on the previous task node:

Monitor task events

Step 1: Write a task listener class in accordance with the rules of the activiti framework

/**
 * 自定义任务监听器
 */
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 + "]负责办理");
	}
}

Step 2: Register the listener class
Insert picture description here
Description:
1. The task listener supports the following attributes:
event (required): the task type that the task listener will be called. The possible types are:

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

The newly added task monitor is wrapped inside the executionListenermonitor, and the sequence is:execution Start--> task Assignment-->task Create-->task Complete-->execution End

The third step: handle the task, call the listener class by the framework through reflection

/**
 * 任务监听器测试
 */
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 );
	}
}

Guess you like

Origin blog.csdn.net/BruceLiu_code/article/details/113643774