有时候我们想为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="true" /> <property name="jobExecutorActivate" value="true" /> <!-- 添加的自定义解析器,用于在任务中绑定监听器 --> <property name="customDefaultBpmnParseHandlers"> <list><bean class="me.lb.activiti.parser.CustomUserTaskParseHandler" /></list> </property> ... </bean>
之后是任务解析器的实现
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)); } }
至此,我们就可以为任何一个任务加入自定义的全局监听器,当然,任务解析器还有很多使用的方式,并不局限于全局监听器,这就需要看实际情况的需求了。
时间: 2024-11-09 02:50:09