Flowable入门系列文章186 - 挂钩进程解析

需要将BPMN 2.0 XML解析为Flowable内部模型以在Flowable引擎上执行。这种解析发生在进程部署期间,或者在内存中找不到进程,并且从数据库中提取XML。

对于这些过程中的每一个,这个BpmnParser类都创建一个新的BpmnParse实例。这个实例将被用作解析过程中所有事物的容器。解析本身非常简单:对于每个BPMN 2.0元素,org.flowable.engine.parse.BpmnParseHandler引擎中都有一个可用的匹配实例。因此,解析器具有一个基本上将BPMN 2.0元素类映射到一个实例的映射BpmnParseHandler。默认情况下,Flowable具有BpmnParseHandler实例来处理所有支持的元素,并使用它来将执行监听器附加到创建历史的过程的步骤。

可以将自定义实例添加org.flowable.engine.parse.BpmnParseHandler到Flowable引擎。例如,经常见到的用例是将执行侦听器添加到将事件引发到某个队列以进行事件处理的某些步骤。历史处理在Flowable内部以这种方式完成。要添加这样的自定义处理程序,需要调整Flowable配置:

<property name="preBpmnParseHandlers">
<list>
<bean class="org.flowable.parsing.MyFirstBpmnParseHandler" />
</list>
</property>
<property name="postBpmnParseHandlers">
<list>
<bean class="org.flowable.parsing.MySecondBpmnParseHandler" />
<bean class="org.flowable.parsing.MyThirdBpmnParseHandler" />
</list>
</property>

BpmnParseHandler在preBpmnParseHandlers属性中配置的实例列表将添加到任何默认处理程序之前。同样,postBpmnParseHandlers在那之后加入。如果事情的顺序与自定义分析处理程序中包含的逻辑有关系,这可能很重要。

org.flowable.engine.parse.BpmnParseHandler 是一个简单的界面:

public interface BpmnParseHandler {
Collection<Class>? extends BaseElement>> getHandledTypes();
void parse(BpmnParse bpmnParse, BaseElement element);
}

该getHandledTypes()方法返回由此解析器处理的所有类型的集合。可能的类型是类BaseElement的集合的一个子类。您也可以扩展AbstractBpmnParseHandler该类并重写该getHandledType()方法,该方法只返回一个类而不是集合。这个类还包含许多默认解析处理程序共享的帮助程序方法。BpmnParseHandler解析器遇到此方法返回的任何类型时,将调用该实例。在下面的例子中,无论什么时候遇到包含在一些BPMN 2.0 XML中的进程,它都会执行executeParse方法中的逻辑(这是一种替换接口parse上常规方法的类型转换方法BpmnParseHandler)。

public class TestBPMNParseHandler extends AbstractBpmnParseHandler<Process> {
	protected Class<? extends BaseElement> getHandledType() {
		return Process.class;
	}
	protected void executeParse(BpmnParse bpmnParse, Process element) {
		..
	}
}

重要说明:在编写自定义分析处理程序时,不要使用任何用于分析BPMN 2.0结构的内部类。这将导致难以发现的错误。实现自定义处理程序的安全方法是实现BpmnParseHandler接口或扩展内部抽象类org.flowable.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler。

BpmnParseHandler将负责解析BPMN 2.0元素的默认实例替换为内部Flowable模型是可能的(但不太常见)。这可以通过下面的逻辑片段完成:

<property name="customDefaultBpmnParseHandlers">
<list>
...
</list>
</property>

例如,一个简单的例子就是强制所有的服务任务是异步的:

public class CustomUserTaskBpmnParseHandler extends ServiceTaskParseHandler {
protected void executeParse(BpmnParse bpmnParse, ServiceTask serviceTask) {
// Do the regular stuff
super.executeParse(bpmnParse, serviceTask);
// Make always async
serviceTask.setAsynchronous(true);
}
}

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值