接上文,业务应用和流程引擎之间以及流程引擎和业务服务组件之间通过良好定义的接口进行交互。
业务应用和流程引擎之间的接口称为北向接口,流程引擎和业务组件之间的接口称为南向接口,流程引擎的其他接口如管理接口在此忽略。
1.北向接口
北向接口主要是事件引擎提供的面向业务应用的接口(我们的事件引擎是一个简单的事件引擎,用来接收事件、派发和管理事件。业务复杂后可采用复杂事件处理CEP),主要是事件通道(EventChannel)和业务事件。
事件通道是事件引擎提供的接口,用来接收业务应用的业务事件,业务应用通过事件通道交付业务事件。
业务事件分为同步事件和异步事件。业务应用交付同步事件时需要等待业务服务组件处理完毕后才返回,异步事件只要交付到事件引擎就立即返回,不必等待事件处理完毕。异步事件处理完后将事件处理结果通知流程引擎。
1.1业务事件类层次
BusinessEvent类
该类采用范型定义如下:
//ResultDto为事件处理器(EventHandler)方法的返回值类型,BusinessDataDto为业务数据类
public abstract class BusinessEvent <ResultDto,BusinessDataDto> {
private String processName; //流程名称
private Integer businessKey; //业务key,对我们的应用来讲,就是交易id(tradeId),为了BusinessEvent通用性,其类型也可范型化。
private String eventType; //事件类型id
private BusinessDataDto businessData ; //事件包含的业务数据,对下单事件,为下单时的订单OrderDto
private String role; //触发事件的角色,如buyer(买家)、seller(卖家)、timer(超时定时器)等
private int actorId; //事件触发人的id,在我们的系统中,主要用于买卖家
private Date eventTime; //触发事件时间
private String eventSource; //事件源
private String eventSerial; //事件流水号,唯一,类似uuid
private long workItemId; //工作项id
private bool isInitialEvent;//是否初始事件,初始事件(位于开始节点中的事件)用来指示流程引擎创建新的流程实例。
public BusinessEvent(String eventType,Integer businessKey,BusinessDataDto businessData){
...
}
...
/*deliver方法用来交付事件,就是将事件通过事件通道传给事件引擎*/
public abstract ResultDto deliver();
}
同步事件类SyncBusinessEvent
public class SyncBusinessEvent <ResultDto,BusinessDataDto> extends BusinessEvent <ResultDto,BusinessDataDto>{
public SyncBusinessEvent(String eventType,Integer businessKey,BusinessDataDto businessData){
...
}
/*将事件通过事件通道传给事件引擎,并等待事件处理结果*/
public ResultDto deliver(){
//获取事件通道eventChannel
EventChannel eventChannel = EventChannelFactory.getEventChannel();
return (ResultDto) eventChannel.syncSend(this); //同步发送事件,返回事件处理结果。
}
}
使用方法如下:
/*买家在前台业务应用中下单时,业务应用创建下单事件,PlaceOrderResult,OrderDto均为业务应用的具体Java类
下单事件为启动流程的初始事件,没有businessKey,所以构造函数第二个参数传null。返回值类型PlaceOrderResult中包含有businessKey,就是tradeId属性,初始事件处理拦截器中需要用到该属性来建立businessKey和流程实例id的绑定关系*/
BusinessEvent <PlaceOrderResult,OrderDto> event = new SyncBusinessEvent<PlaceOrderResult,OrderDto>("submitOrder",null,orderDto);
//调用deliver方法交付事件,得到下单处理结果
PlaceOrderResult result = event.deliver();
在实际应用中,可以为每个流程从该类再派生一个子类,在每个子类中为processName赋值(写死为对应的流程)。
异步事件类AsyncBusinessEvent
public class AsyncBusinessEvent <BusinessDataDto> extends BusinessEvent <Boolean,BusinessDataDto>{
public AsyncBusinessEvent(String eventType,Integer businessKey,BusinessDataDto businessData){
...
}
/*交付事件,不等待事件处理结果。
返回值为TRUE表示事件引擎已成功接收异步事件
*/
public Boolean deliver(){
//获取事件通道eventChannel
EventChannel eventChannel = EventChannelFactory.getEventChannel();
return (Boolean) eventChannel.asyncSend(this); //异步发送事件,事件引擎收到就返回,不返回事件处理结果。
}
}
交付异步事件的demo如下:
BusinessEvent<Boolean,XXXDto> event = new AsyncBusinessEvent<XXXDto>(......); //XXXDto为一个具体的java类
Boolean deliverResult = event.deliver();
1.2事件通道EventChannel接口
事件通道用来接收业务应用 交付(deliver)的业务事件,它提供两个方法syncSend和asyncSend,分别用来同步发送和异步发送事件。
北向接口还包括查询流程实例当前状态的接口和根据角色查询节点url的接口(例如买家和买家在同一个流程节点可以有不同的html页面url来操作和查看订单与交易)。
2.南向接口
南向接口为业务服务组件的接口,流程引擎根据事件中的eventType属性调用对应的业务组件接口方法(在流程定义文件中eventHanderMap中定义了每种eventType对应的业务组件和事件处理方法名)。
可以统一定义一个泛型的业务组件接口(事件处理接口),例如定义一个含有handleEvent方法的EventHandler接口,这样下单事件和确认收货事件的事件处理方法名都是handleEvent,这种方式的一个缺点是业务语义太弱,从方法名上无法区分是下单还是确认收货。另一种方法是自由个性化定义,不定义统一的业务组件接口,这样每个事件的事件处理方法名可不一样,例如下单事件的方法名为placeOrer,业务语义很强。
A)南向接口统一定义(泛型),接口如下:
interface BusinessEventHandler<ResultDto,BusinessDataDto>{
ResultDto handleEvent(BusinessDataDto);
}
所有的业务组件均实现该接口。
B)自由个性化定义
对处理下单事件的业务服务组件,其处理下单事件的placeOrder方法签名可能定义如下(自由定义):
interface PlaceOrderService{
// 该方法值返回类型PlaceOrderResult和OrderDto参数类型和 1.1下单事件BusinessEvent中的类型要一致
public PlaceOrderResult placeOrder(OrderDto orderDto) {
...
}
...
}
可见handleEvent方法的业务语义没有placeOrder方法强。
3.初始事件的处理
事件类中的processName(流程名称)加上businessKey可唯一映射到一个流程实例id,业务应用和业务服务组件通常不关注流程实例id,也就是希望流程实例id是透明的。
为了保持透明,需要在初始事件(开始节点中的事件为初始事件,流程引擎为初始事件创建流程实例)处理中建立processNme+businessKey与流程实例id的绑定关系。
为了建立绑定关系,在开始节点的事件eventHandler中配置拦截器,从eventHandler的返回值属性中得到businessKey。
相关推荐
Snaker是一个基于Java的轻量级工作流引擎,适用于企业应用中常见的业务流程。本着轻量、简单、灵巧理念设计,定位于简单集成,多环境支持。snaker-core.jar大小208K,代码行数约7000行,强大的扩展支持,不依赖于...
SnakerFlow是一款开源轻量级流程引擎,专为简化企业工作流程管理而设计。它提供了服务端和客户端的完整解决方案,使得开发者可以快速构建出符合业务需求的工作流系统。在这个项目中,我们只关注服务端部分,即...
总的来说,Snakerflow开源轻量流程引擎客户端为开发者提供了一个强大的工具,帮助他们构建灵活的业务流程管理系统。通过深入学习和实践,开发者可以利用Snakerflow提升业务流程自动化水平,提高工作效率。
总的来说,这篇论文详尽地探讨了轻量级工作流引擎的设计原则和实现方法,涵盖了从需求分析到系统架构的全过程,对于理解和开发此类系统具有很高的实践价值。对于那些寻求构建高效、灵活的工作流解决方案的开发者和...
LiteFlow是一款专为Java开发人员设计的轻量级流程引擎,它的核心优势在于: - **轻量级**:LiteFlow的实现十分简洁,几乎不引入额外的性能开销。 - **易扩展**:用户可以根据业务需求自定义流程节点(Component),...
【轻量级工作流引擎设计与实现】 工作流引擎是一种软件系统,用于自动化组织内的业务流程,使得工作流程能够按照预定义的规则和步骤进行。轻量级工作流引擎则是针对小型企业和简单业务场景设计的,它具有低耦合、高...
首先,轻量级音视频引擎的核心在于对多媒体处理流程的深入理解和优化。这一过程中包括了接收媒体文件、解析文件格式、分离音频和视频流以及解码输出等关键步骤。文件接收是引擎工作的起点,通常采用HTTP传输协议,...
基于关系结构的轻量级工作流引擎是一种针对关键业务开发而设计的解决方案,它旨在简化工作流系统的复杂性,同时保持高效性和灵活性。 1. **关系结构的优势**: 在传统的关系数据库管理系统(RDBMS)基础上构建工作...
【轻量级的Bug管理工具】是一款专为小型团队或个人开发者设计的高效问题跟踪解决方案。相较于重量级的Bug管理工具如禅道,它具备更小巧的体积和更简单的使用流程,无需安装即可运行,降低了使用的门槛。这款工具的...
开发轻量级GUI系统的过程中,首先需要分析系统的架构,包括图形引擎和输入引擎的设计。图形引擎负责处理图形绘制和更新,而输入引擎则处理用户的交互输入。为了实现自主、轻型和资源占用少的GUI系统,通常需要优化...
Git-js是针对Node.js环境设计的一个轻量级库,它提供了一个简单易用的接口,允许开发者在他们的Node.js应用中直接调用Git命令,无需离开JavaScript的舒适区。 ### Git-js核心特性 1. **轻量级**:Git-js的核心设计...
LiteFlow是一款轻量级的工作流引擎,专为简化工作流程管理和自动化任务执行而设计。它在实际项目中具有广泛的应用,特别是在需要灵活控制业务流程、提高效率的场景下。本篇将深入解析LiteFlow的核心特性、设计理念...
本文主要探讨了在嵌入式Linux环境下,如何基于Microwindows设计一个轻量级的图形应用库,以满足低端嵌入式系统的需要。Microwindows是一个开源的、轻量级的窗口系统,它适用于资源有限的设备,如消费电子和测量控制...
《轻量级Django》这本书聚焦于如何在实际开发中运用Django这一强大的Python Web框架,结合现代前端技术,如REST API、WebSockets和Backbone.js,来构建高效、响应迅速的Web应用。以下是对这些核心知识点的详细解读:...
【基于WebGL和glTF的快速轻量级JavaScript游戏引擎】是一个专为现代网页游戏开发设计的高效解决方案。它利用了WebGL技术,这是一种在浏览器中实现的OpenGL标准,允许开发者在无需插件的情况下创建3D图形。JavaScript...
在Java Web开发领域,轻量级框架已经成为主流,它们提供了高效、灵活且易于维护的解决方案。本主题聚焦于“Java Web轻量级开发全体验15”,这可能是指一系列教程或项目的第15个部分,重点是通过代码实践来学习和理解...
本文将详细介绍如何将SnakerFlow与SpringBoot整合,构建一个快速工程应用的轻量级工作流引擎组件。 首先,了解SnakerFlow。SnakerFlow是一款面向开发者的工作流引擎,它提供了强大的流程设计、执行和监控功能。其...