使用自定义的任务解析器

有时候我们想为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

使用自定义的任务解析器的相关文章

SpringMVC自定义多视图解析器

实现通过请求url后缀判断返回值类型, 例如 localhost:8080/list 返回JSP页面, localhost:8080/list.json返回json格式数据 1.创建一枚举返回值类型 public enum ResultType { REDIRECT, JSP, JSON, XML } 2.创建自定义的viewResolver 1 public class JsonViewResolver implements ViewResolver { 2 3 private View vi

Spring自定义argumentResolver参数解析器

在一个web程序中,当一个HTTP请求进来时,会被容器处理进而转换成一个servlet请求.http请求所携带的数据,虽然是格式化的但是无类型:而java作为强类型语言,同时为了健壮性考虑,必然要有完善的类型约束.当然,那么,将数据从servlet请求中转换到java中,一个很原始的方式是手动处理.幸好,Spring MVC通过以注解往函数添加额外信息的方式,使得上述的数据转换过程能够交由框架自动处理.从一个角度去看,Controller中的函数声明及注解定义了此HTTP请求的数据格式和类型,也

Python3自定义json逐层解析器

用python3对json内容逐层进行解析,拿中国天气网的接口返回数据测试,代码如下: # -*- coding: utf-8 -*- import operator as op from collections import defaultdict, deque class Json(object): def __init__(self, json: str): sth = eval(json) load = lambda sth: sth if op.eq(type(sth).__name_

[转载]开发 Spring 自定义视图和视图解析器

原文出处 http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 概述 Spring 3.0 默认包含了多种视图和视图解析器,比如 JSP.Velocity 视图等,但在某些情况下,我们需要开发自定义的视图及其解析器,以便显示特殊文件格式的视图,我们也可以使用自定义视图及解析器,针对特定的视图做相应的处理.本文将通过一个示例来介绍如何开发 Spring 自定义视图和视图解析器,来显示后缀名为 SWF 的视图,并提供一个简单的注册机制,

自定义表达式解析器

解析器: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; imp

SpringMVC自动封装List对象——自定义参数解析器

前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface at org.springframework.beans.B

基于Spring开发——自定义标签及其解析

1. XML Schema 1.1 最简单的标签 一个最简单的标签,形式如: <bf:head-routing key="1" value="1" to="test2"/> 该标签只包含了若干属性,我们就在xsd文件中这么定义 <!-- 声明一个标签,名字为head-routing,他的类型为headRouting--> <xsd:element name="head-routing" type=

springMVC自定义方法属性解析器

使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@ModelAttribute来进行参数值的注入,但这样需要写2个注解,其中SessionAttributes加在类上,ModelAttribute加在方法的属性上. SpringMVC提供了HandlerMethodArgumentResolver接口来处理我们的自定义参数的解析. 例子: 1.获取用户信息的

基于BeanNameViewResolver解析器,自定义视图

概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 创建AbstractView的实现类 package cn.sinobest.jzpt.zfba.fzyw.xzfy.dfcl.view; import java.util.List; import java.util.Map; import javax.annotation.Resource;