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