"Activiti Workflow Framework"주제 (7) -Activiti 워크 플로우 프레임 워크 리스너 (리스너)

1. 리스너 개요

이 과정에서 우리는 때때로 전체 프로세스 또는 노드의 특정 상태를 그에 따라 처리합니다. 이때 리스너가 사용됩니다.
Activiti의 프로세스 모니터링은 주로 두 가지 종류로 구분된다 执行监听器하고 任务监听器.

2. 실행 리스너 (ExecutionListener)

실행 리스너는 프로세스 정의에서 이벤트가 발생할 때 외부 Java 코드를 실행하거나 표현식을 실행할 수 있습니다. 트리거 될 수 있습니다 ...

프로세스 인스턴스의 이벤트 모니터링

1 단계 : 프레임 워크 규칙에 따라 리스너 클래스 작성 리스너
여기에 사진 설명 삽입
구성 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 로직 또는 표현식을 실행할 수 있습니다.

작업 리스너는 프로세스 정의의 사용자 작업에만 추가 할 수 있습니다. 이전 작업 노드에 작업 모니터링을 추가합니다.

작업 이벤트 모니터링

1 단계 : 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 + "]负责办理");
	}
}

2 단계 : 리스너 클래스 등록
여기에 사진 설명 삽입
설명 :
1. 태스크 리스너는 다음 속성을 지원합니다.
이벤트 (필수) : 태스크 리스너가 호출 될 태스크 유형. 가능한 유형은 다음과 같습니다.

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

추천

출처blog.csdn.net/BruceLiu_code/article/details/113643774