`
顽石
  • 浏览: 163991 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

轻量流程引擎接口设计

 
阅读更多

接上文,业务应用和流程引擎之间以及流程引擎和业务服务组件之间通过良好定义的接口进行交互。

业务应用和流程引擎之间的接口称为北向接口,流程引擎和业务组件之间的接口称为南向接口,流程引擎的其他接口如管理接口在此忽略。

 

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。

  • 大小: 70 KB
分享到:
评论
1 楼 maetrive 2016-08-02  
很不错!

相关推荐

    基于Java的轻量级工作流引擎,适用于企业应用中常见的业务流程

    Snaker是一个基于Java的轻量级工作流引擎,适用于企业应用中常见的业务流程。本着轻量、简单、灵巧理念设计,定位于简单集成,多环境支持。snaker-core.jar大小208K,代码行数约7000行,强大的扩展支持,不依赖于...

    本项目为SWPU数据库原理及应用大作业《西柚外卖订餐系统》,基于Python+Flask+MySQL开发,轻量简洁.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    SpringBoot2.7集成flowable最新版,java工作流服务端实现,解耦设计

    # 基于原生flowable实现的流程引擎 本项目基于最新6.8.0的flowable,使用最新springboot集成。文档请联系作者索要。...单独启动项目后,通过配套的sdk调用官方接口,就能够完成工作流的快速接入,轻量解耦。

    该系统是基于Activiti5工作流引擎采用了SSM+Mysql实现的一个学生请假系统.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    java源码流程审批-workflow:基于Activiti5定制化中国式工作流系统,定制化的流程设计器,添加自定义属性

    Activiti是一种轻量级,可嵌入的BPM引擎。 它将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和的BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresc

    Activiti6.0教程例子下载

    Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。 1.4....

    基于JavaEE的快速开发框架

    允许执行标准的SQL或存储过程,同时提供了一个简单、轻量的ORM工具,并集成Hibernate、MyBatis为复杂ORM需求提供支持。 提供MongoDB工具实现对NoSQL的支持,支持负载均衡。 提供轻量级、快速响应的控制器,允许设置...

    java开源包1

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    本项目是一个基于springMVC的图书管理系统设计.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    HITSZ 2021 年秋季学期「数据库设计」课程实验项目,基于 MySQL+Django 实现校园食堂点餐系统。.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    javaweb(jsp)-课程设计-图书购物网站,基于JSP(MVC模式)和MySQL的网上图书购物系统.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

    asp.net知识库

    ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+...

    java开源包11

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包2

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包3

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包6

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包5

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包10

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    基于Java+Springboot+Vue的宿舍管理系统.zip

    嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和...

Global site tag (gtag.js) - Google Analytics