首页 > 代码库 > 使用自定义的任务解析器

使用自定义的任务解析器

有时候我们想为activiti中每个任务绑定一个类似全局监听器的东西,但是又不能每次手动为任务添加监听器(太繁琐了),所以就会用到自定义的任务解析器。
先看activiti的配置,这样可以用自定义的任务解析器代替activiti默认的任务解析器(原理可以自行查询源码)
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
	<property name="dataSource" ref="dataSource" />
	<property name="transactionManager" ref="transactionManager" />
	<property name="databaseSchemaUpdate" value=http://www.mamicode.com/"true" />>
之后是任务解析器的实现
package me.lb.activiti.parser;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.parse.BpmnParseHandler;

public class CustomUserTaskParseHandler implements BpmnParseHandler {

	public Collection<Class<? extends BaseElement>> getHandledTypes() {
		// 该方法会被activiti的设置调用,并与内置的任务解析器比对,如果类型一致,将代替默认的任务解析器
		Set<Class<? extends BaseElement>> types = new HashSet<Class<? extends BaseElement>>();
		types.add(UserTask.class);
		return types;
	}

	public void parse(BpmnParse bpmnParse, BaseElement baseElement) {
		// 调用默认的任务解析器
		new UserTaskParseHandler().parse(bpmnParse, baseElement);
		TaskDefinition taskDefinition = (TaskDefinition) bpmnParse
				.getCurrentActivity().getProperty(
						UserTaskParseHandler.PROPERTY_TASK_DEFINITION);
		// 自定义任务解析(添加监听器)
		ActivitiListener custom = new ActivitiListener();
		// 绑定监听事件
		custom.setEvent(TaskListener.EVENTNAME_CREATE);
		// 设置监听器的实现类
		custom.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS);
		custom.setImplementation("me.lb.activiti.listener.CustomTaskListener");
		// 设置需要注入的属性
		List<FieldExtension> fes = new ArrayList<FieldExtension>();
		FieldExtension field_test = new FieldExtension();
		field_test.setFieldName("test");
		field_test.setStringValue("test:1:100");
		fes.add(field_test);
		custom.setFieldExtensions(fes);
		// 将监听器绑定到任务
		taskDefinition.addTaskListener(TaskListener.EVENTNAME_CREATE, bpmnParse
				.getListenerFactory().createClassDelegateTaskListener(custom));
	}

}

最后即一个测试的全局监听器
package me.lb.activiti.parser;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.parse.BpmnParseHandler;

public class CustomUserTaskParseHandler implements BpmnParseHandler {

	public Collection<Class<? extends BaseElement>> getHandledTypes() {
		// 该方法会被activiti的设置调用,并与内置的任务解析器比对,如果类型一致,将代替默认的任务解析器
		Set<Class<? extends BaseElement>> types = new HashSet<Class<? extends BaseElement>>();
		types.add(UserTask.class);
		return types;
	}

	public void parse(BpmnParse bpmnParse, BaseElement baseElement) {
		// 调用默认的任务解析器
		new UserTaskParseHandler().parse(bpmnParse, baseElement);
		TaskDefinition taskDefinition = (TaskDefinition) bpmnParse
				.getCurrentActivity().getProperty(
						UserTaskParseHandler.PROPERTY_TASK_DEFINITION);
		// 自定义任务解析(添加监听器)
		ActivitiListener custom = new ActivitiListener();
		// 绑定监听事件
		custom.setEvent(TaskListener.EVENTNAME_CREATE);
		// 设置监听器的实现类
		custom.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS);
		custom.setImplementation("me.lb.activiti.listener.CustomTaskListener");
		// 设置需要注入的属性
		List<FieldExtension> fes = new ArrayList<FieldExtension>();
		FieldExtension field_test = new FieldExtension();
		field_test.setFieldName("test");
		field_test.setStringValue("test:1:100");
		fes.add(field_test);
		custom.setFieldExtensions(fes);
		// 将监听器绑定到任务
		taskDefinition.addTaskListener(TaskListener.EVENTNAME_CREATE, bpmnParse
				.getListenerFactory().createClassDelegateTaskListener(custom));
	}

}

至此,我们就可以为任何一个任务加入自定义的全局监听器,当然,任务解析器还有很多使用的方式,并不局限于全局监听器,这就需要看实际情况的需求了。

使用自定义的任务解析器