1. 程式人生 > >Activiti的學習(五)——監聽器

Activiti的學習(五)——監聽器

在流程中我們有時會對整個流程或者一個節點的某種狀態做出相應的處理。這時就會用到監聽器。

在Activiti中流程的監聽主要分為兩大類,執行監聽器和任務監聽器。

一、執行監聽器(ExecutionListener)

執行監聽器可以執行外部java程式碼或執行表示式,當流程定義中發生了某個事件,可以出觸發。

監聽流程例項的事件

按照框架的規則編寫監聽器類

配置監聽器,XML程式碼如下:

說明:

1.任務監聽器支援以下屬性:

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("任務辦理成功....");
	}
}

二、任務監聽器(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 + "]負責辦理");
	}
}

註冊監聽類

說明:

任務監聽器支援以下屬性:

event(必選):任務監聽器會被呼叫的任務型別。 可能的型別為:

create:任務建立並設定所有屬性後觸發。

assignment:任務分配給一些人時觸發。 當流程到達userTaskassignment事件 會在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 );
	}
}