一种工作流数据持久化的方法和装置与流程

文档序号:12041961阅读:302来源:国知局
一种工作流数据持久化的方法和装置与流程
本申请涉及工作流数据处理的技术领域,特别是涉及一种工作流数据持久化的方法和一种工作流数据持久化的装置。

背景技术:
工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。将整个业务过程看作是一条河,其中流过的河水就是工作流。工作流属于计算机支持的协同工作(ComputerSupportedCooperativeWork,CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。许多公司采用纸张表单,手工传递的方式,一级一级审批签字,工作效率非常低下,对于统计报表功能则不能实现。而采用工作流软件,使用者只需在电脑上填写有关表单,会按照定义好的流程自动往下跑,下一级审批者将会收到相关资料,并可以根据需要修改、跟踪、管理、查询、统计、打印等,大大提高了效率。工作流数据的持久化是一个工作流产品必不可少的组成部分,传统工作流产品的数据持久化实现方式,无法灵活无侵入的满足各种持久化需求,以现有技术中常用的JBPM3、JBPM4(JavaBusinessProcessManagement,业务流程管理)等产品为例,其实现了一种同步持久化工作流数据的方式,基于所述JBPM3、JBPM4等产品,现有技术还提出了一种改进的工作流数据的持久化方式,具体包括如下步骤:步骤一:找到工作流持久化数据的代码,在里面增加一个判断机制。如果发现流程上下文中存在异步标志,则调用异步队列,做异步持久化数据操作。如果同步,则直接调用同步方法。步骤二:当有一个新的持久化需求时,例如:需要根据一个指定的路由,调用远程服务器异步持久化流程数据。这个时候再次改动代码,增加判断和相应的标识符。可以看出,现有技术的方案是基于硬编码的形式实现,每当增加一种持久化方式时,都需要修改代码。增加了维护的成本,不利于业务的扩展。因此,目前本领域技术人员迫切需要解决的一个技术问题在于。如何创造性的提出一种工作流数据持久化的机制,用以节省维护成本,增强工作流产品的扩展性。

技术实现要素:
本申请的目的是提供一种工作流数据持久化的方法和装置,用以提高计算机和各种用户终端应用的安全性,成为本领域技术人员迫切需要解决的问题。为了解决上述问题,本申请公开了一种工作流数据持久化的方法,包括:提取服务端配置文件中声明的服务信息;其中,所述服务信息包括工作流数据持久化服务信息;为客户端配置文件中声明的服务接口创建动态代理类,并生成所述服务接口的策略配置信息;其中,所述服务接口包括工作流数据持久化服务接口,所述策略配置信息包括工作流数据持久化的策略配置信息;获得需要进行持久化的目标工作流数据;调用所述工作流数据持久化服务接口获得其动态代理类,并在所述动态代理类中将所述目标工作流数据组装成事件;按照所述工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作。优选的是,所述工作流数据持久化服务信息包括:服务接口的实现类,服务接口实现类的地址,服务接口实现类中的方法以及方法中声明的参数类型;在所述提取服务端配置文件中声明的服务信息的步骤之后,所述的方法还包括:将所述服务信息按照预置的第一数据格式注册到服务端容器中。优选的是,所述预置的第一数据格式包括:服务容器及注册类ServiceRegistry,其中,成员变量包括:表示包含各种不同名称的服务信息集合staticMap<String,ServiceInfo>;服务接口实现的信息ServiceInfo,其中,成员变量包括:服务接口的实现类,暴露的服务接口,服务接口实现类的地址serviceURI,服务接口实现类中的方法信息集合Map<String,OperationInfo>;服务接口实现类中方法的信息OperationInfo,其中,成员变量包括:方法名,方法中声明的参数信息集合List<ParameterInfo>,方法返回值信息ReturnInforeturnInfo)方法异常信息集合List<ExceptionInfo>,方法对象(Methodmethod);方法中声明的参数信息ParameterInfo,其中,成员变量包括:参数类型StringtypeName,参数类型类Classtype;方法返回值信息ReturnInfo,其中,成员变量包括:返回值类型StringtypeName,返回值类型类Classtype;方法异常信息ExceptionInfo,其中,成员变量包括:异常类型StringtypeName,异常类型类Classtype。优选的是,在为客户端配置文件中声明的服务接口创建动态代理类的步骤之后,所述的方法还包括:将所述动态代理类注册到客户端容器中。优选的是,所述工作流数据持久化策略的配置信息包括:表示事件发生时,执行的行为动作的事件策略eventName;表示存储信息时,采用某种存储方式的存储策略storeRule;表示消息传递的路由机制的路由策略routeRule;表示接口实现类所在的位置的服务实现地址endpointUrl;表示事件信息的调用方式的调用策略invokeType;和/或,表示消息被消费成功后,自动回调发起方的地址的回调地址callbackUri。优选的是,所述事件为统一事件;所述调用工作流数据持久化服务接口获得其动态代理类,并在所述动态代理类中将目标工作流数据组装成事件的步骤包括:从所述客户端容器中调用工作流数据持久化服务接口;由所述工作流数据持久化服务接口调用对应的动态代理类;在所述动态代理类中,根据所述服务接口实现类中的方法以及方法中声明的参数类型,以及,工作流数据持久化的策略配置信息,将所述目标工作流数据按照预置的第二数据格式组装成统一事件。优选的是,所述预置的第二数据格式包括:统一事件对象UniformEvent:其中,成员变量包括:事件序列IDeventId,事件名称eventName,事件回调地址callbackUri,事件创建时间createdTime,事件发送时间sendedTime,事件上带的统一消息对象UniformMessage;统一消息对象UniformMessage:其中,成员变量包括:消息IDmessageId,消息头UniformMessageHeader,消息体UniformMessagePlayload,消息处理结果返回值Objectresponse;统一消息体对象UniformMessagePlayload:其中,成员变量包括:参数列表Object[]params;统一消息头对象UniformMessageHeader:其中,成员变量包括:事件的名字eventName,事件回调地址callbackUri,消息产生的时间createdTime,消息发送时间sendedTime,服务端实现地址endpointUrl,方法名methodName,消息计划消费的时间planTime,存储规则storeRule,路由规则routeRule,超时时间timeout,失败重试次数retry,调用方式:同步/异步invokeType。优选的是,所述按照工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作的步骤包括:获取依据所述调用策略配置的事件中消息的调用方式,若为同步调用,则触发所述事件,所述事件具有事件名称;根据所述事件名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中。优选的是,在调用所述工作流数据持久化服务接口之前,所述的方法还包括:在预设的事务管理器中启动事务;所述按照工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作的步骤包括:获取依据所述调用策略配置的事件中消息的调用方式,若为异步调用,则创建事务同步器,并在所述事务管理器中注册事务同步器;提交事务,调用事务同步器,根据所述存储策略保存事件中的消息,然后将事件加入异步队列中;异步队列监听器监听到有事件加入时,触发所述事件;根据所述事件的名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中;若所述服务接口实现类调用成功,则根据所述存储策略,删除保存过的事件消息,然后根据所述回调地址,回调发起方通知操作成功;若所述服务接口实现类调用失败,则根据所述回调地址,回调发起方执行补偿业务操作。优选的是,所述获得需要进行持久化的目标工作流数据的步骤包括:流程实例开始流转,遇到需要保存数据的节点,将节点实例的数据保存到流程上下文中指定的有序队列中;流程实例流转结束,获取所述有序队列中的节点实例数据为需要进行持久化的目标工作流数据。本申请实施例还公开了一种工作流数据持久化的装置,包括:服务端配置模块,用于提取服务端配置文件中声明的服务信息;其中,所述服务信息包括工作流数据持久化服务信息;客户端配置模块,用于为客户端配置文件中声明的服务接口创建动态代理类,并生成所述服务接口的策略配置信息;其中,所述服务接口包括工作流数据持久化服务接口,所述策略配置信息包括工作流数据持久化的策略配置信息;工作流数据获取模块,用于获得需要进行持久化的目标工作流数据;代理类调用模块,用于调用所述工作流数据持久化服务接口获得其动态代理类,并在所述动态代理类中将所述目标工作流数据组装成事件;事件执行模块,用于按照所述工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作。优选的是,所述工作流数据持久化服务信息包括:服务接口的实现类,服务接口实现类的地址,服务接口实现类中的方法以及方法中声明的参数类型;所述的装置还包括:服务容器注册模块,与所述服务端配置模块相连,用于将所述服务信息按照预置的第一数据格式注册到服务端容器中。优选的是,所述预置的第一数据格式包括:服务容器及注册类ServiceRegistry,其中,成员变量包括:表示包含各种不同名称的服务信息集合staticMap<String,ServiceInfo>;服务接口实现的信息ServiceInfo,其中,成员变量包括:服务接口的实现类,暴露的服务接口,服务接口实现类的地址serviceURI,服务接口实现类中的方法信息集合Map<String,OperationInfo>;服务接口实现类中方法的信息OperationInfo,其中,成员变量包括:方法名,方法中声明的参数信息集合List<ParameterInfo>,方法返回值信息ReturnInforeturnInfo)方法异常信息集合List<ExceptionInfo>,方法对象(Methodmethod);方法中声明的参数信息ParameterInfo,其中,成员变量包括:参数类型StringtypeName,参数类型类Classtype;方法返回值信息ReturnInfo,其中,成员变量包括:返回值类型StringtypeName,返回值类型类Classtype;方法异常信息ExceptionInfo,其中,成员变量包括:异常类型StringtypeName,异常类型类Classtype。优选的是,所述的装置,还包括:客户端容器注册模块,与所述客户端配置模块相连,用于将所述动态代理类注册到客户端容器中。优选的是,所述工作流数据持久化策略的配置信息包括:表示事件发生时,执行的行为动作的事件策略eventName;表示存储信息时,采用某种存储方式的存储策略storeRule;表示消息传递的路由机制的路由策略routeRule;表示接口实现类所在的位置的服务实现地址endpointUrl;表示事件信息的调用方式的调用策略invokeType;和/或,表示消息被消费成功后,自动回调发起方的地址的回调地址callbackUri。优选的是,所述事件为统一事件;所述代理类调用模块包括:服务接口调用子模块,用于从所述客户端容器中调用工作流数据持久化服务接口;动态代理类提取子模块,用于由所述工作流数据持久化服务接口调用对应的动态代理类;事件组装子模块,用于在所述动态代理类中,根据所述服务接口实现类中的方法以及方法中声明的参数类型,以及,工作流数据持久化的策略配置信息,将所述目标工作流数据按照预置的第二数据格式组装成统一事件。优选的是,所述预置的第二数据格式包括:统一事件对象UniformEvent:其中,成员变量包括:事件序列IDeventId,事件名称eventName,事件回调地址callbackUri,事件创建时间createdTime,事件发送时间sendedTime,事件上带的统一消息对象UniformMessage;统一消息对象UniformMessage:其中,成员变量包括:消息IDmessageId,消息头UniformMessageHeader,消息体UniformMessagePlayload,消息处理结果返回值Objectresponse;统一消息体对象UniformMessagePlayload:其中,成员变量包括:参数列表Object[]params;统一消息头对象UniformMessageHeader:其中,成员变量包括:事件的名字eventName,事件回调地址callbackUri,消息产生的时间createdTime,消息发送时间sendedTime,服务端实现地址endpointUrl,方法名methodName,消息计划消费的时间planTime,存储规则storeRule,路由规则routeRule,超时时间timeout,失败重试次数retry,调用方式:同步/异步invokeType。优选的是,所述事件执行模块包括:第一事件触发子模块,用于获取依据所述调用策略配置的事件中消息的调用方式,若为同步调用,则触发所述事件,所述事件具有事件名称;事件监听子模块,用于根据所述事件名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;路由子模块,用于在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;实现类定位子模块,用于根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;持久化操作子模块,用于调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中。优选的是,所述的装置,还包括:事务启动模块,用于在预设的事务管理器中启动事务;所述事件执行模块包括:事务同步器创建子模块,用于获取依据所述调用策略配置的事件中消息的调用方式,若为异步调用,则创建事务同步器,并在所述事务管理器中注册事务同步器;事务提交处理子模块,用于提交事务,调用事务同步器,根据所述存储策略保存事件中的消息,然后将事件加入异步队列中;第二事件触发子模块,用于异步队列监听器监听到有事件加入时,触发所述事件;事件监听子模块,用于根据所述事件的名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;路由子模块,用于在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;实现类定位子模块,用于根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;持久化操作子模块,用于调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中;调用成功处理子模块,用于在所述服务接口实现类调用成功时,则根据所述存储策略,删除保存过的事件消息,然后根据所述回调地址,回调发起方通知操作成功;调用失败处理子模块,用于在所述服务接口实现类调用失败,则根据所述回调地址,回调发起方执行补偿业务操作。优选的是,所述工作流数据获取模块包括:数据生成子模块,用于流程实例开始流转,遇到需要保存数据的节点,将节点实例的数据保存到流程上下文中指定的有序队列中;数据提取子模块,用于流程实例流转结束,获取所述有序队列中的节点实例数据为需要进行持久化的目标工作流数据。与现有技术相比,本申请包括以下优点:本申请提出了一种全新的工作流数据持久化策略配置框架,根据工作流业务的情况,如增加一种持久化方式时,无需修改代码,只需要简单修改配置文件,即可自由选择事件策略,消息存储策略,路由策略,调用策略等工作流数据持久化的策略实现工作流数据的保存,从而可以节省维护成本,增强工作流产品的扩展性。附图说明图1是以出差借款业务为例的工作流示意图;图2是本申请的一种工作流数据持久化的方法实施例的步骤流程图;图3是应用本申请实施例的一种工作流数据持久化方法执行的具体示例的流程图;图4是本申请的一种工作流数据持久化的装置实施例的结构框图。具体实施方式为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。为使本领域技术人员更好地理解本申请,下面以“出差借款”这个具体的业务来说明本申请涉及到的相关概念术语。参考图1所示的出差借款业务的流程图,员工出差时,可以预先向公司借款用来购买车票,食宿等费用。公司规定,员工出差申请借款的金额小于等于5000元人民币时,需要主管审批,主管审批后,需要财务审批,最后将款项通过银行打款到员工的工资卡中。如果员工借款的金额大于5000元人民币,则需要主管审批,主管审批后,需要经理再次审批,经理审批后需要财务审批,最后将款项通过银行打款到员工的工资卡中。如果主管,经理或财务审批不同意,则需要发邮件告知员工。术语解释如下:节点:是指某一个业务活动定义。在本例中,“财务审批”就是一个节点,此节点需要人参与,称之为任务节点。“银行打款”也是一个节点,此节点无需人参与,称之为自动节点。节点在图1中用长方形框表示。“判断借款金额”这个活动,用来判断流程经过此节点后从哪个分支继续,称之为判断节点。有向连接:是指图1中带箭头的线,表示流程从一个状态通过何种方式到另一个状态。如在本例中,经理审批节点到财务审批节点间,存在一个叫“同意”的有向连接。流程定义:是用来描述某一个业务流程的符号表示,由节点和有向连接组成的静态定义文件。以上术语都是流程配置类的概念,下面介绍流程运行期间的相关概念。活动实例:是指某一次具体的业务请求经过的节点实例。例如:小王计划2010年10月15日去北京出差,申请借款7000元。小王于2010年10月14日上午9点整,在工作流系统中提交申请流程。主管于2010年10月14日上午10点整审批,而后流程继续往下走。其中,描述“主管审批”这个活动的实例为活动实例。通常活动实例包含该活动开始时间,结束时间,计划处理人,实际处理人,预约时间等等不同维度的信息。流程实例:是指某一次具体的业务请求。例如:小王2010年10月15日去北京出差,申请借款7000元。流程实例是由一系列活动实例组成。在这个例子所指的流程实例中,如果最终审批同意,则包含开始节点“出差申请”活动实例,“主管审批”活动实例,“判断借款金额”活动实例,“经理审批”活动实例,“财务审批”活动实例,“银行打款”活动实例,“结束”活动实例。流程上下文变量实例:是指某一次具体的业务请求中,用于在节点间传递信息的数据。通常为名值对(key-value)的形式表现。通用上下文变量实例指的是每个流程实例,无论是否属于同一个流程定义,都具有的上下文变量实例。上下文变量实例通常简称为上下文变量。本申请实施例的核心构思之一在于,创造性的提出一种根据工作流业务的情况,只需要简单修改配置文件,即可自由选择事件策略,消息存储策略,路由策略,调用策略等工作流数据持久化的策略,以实现工作流数据保存的机制。参照图2,示出了本申请的一种工作流数据持久化的方法实施例的步骤流程图,具体可以包括如下步骤:步骤201,提取服务端配置文件中声明的服务信息;其中,所述服务信息包括工作流数据持久化服务信息。在具体实现中,所述工作流数据持久化服务信息可以包括:服务接口的实现类,服务接口实现类的地址,服务接口实现类中的方法以及方法中声明的参数类型。需要说明的是,所述方法中声明的参数类型不是指具体的数据,而是指服务接口实现类中的方法接收什么样类型的参数,是参数类型的声明。在本申请的一种优选实施例中,在所述步骤201之后,可以执行如下步骤:步骤202,将所述服务信息按照预置的第一数据格式注册到服务端容器中。在具体实现中,当系统启动时,可以根据服务端配置XML(服务端配置文件,通常为XML文件),将XML中声明的服务注册到服务端容器中。根据服务端配置XML,将XML中声明的服务注册到服务容器中。作为本申请实施例具体应用的一种示例,所述预置的第一数据格式可以包括如下内容:服务容器及注册类ServiceRegistry,其中,成员变量包括:表示包含各种不同名称的服务信息集合staticMap<String,ServiceInfo>;服务接口实现的信息ServiceInfo,其中,成员变量包括:服务接口的实现类,暴露的服务接口,服务接口实现类的地址serviceURI,服务接口实现类中的方法信息集合Map<String,OperationInfo>;服务接口实现类中方法的信息OperationInfo,其中,成员变量包括:方法名,方法中声明的参数信息集合List<ParameterInfo>,方法返回值信息ReturnInforeturnInfo)方法异常信息集合List<ExceptionInfo>,方法对象(Methodmethod);方法中声明的参数信息ParameterInfo,其中,成员变量包括:参数类型StringtypeName,参数类型类Classtype;方法返回值信息ReturnInfo,其中,成员变量包括:返回值类型StringtypeName,返回值类型类Classtype;方法异常信息ExceptionInfo,其中,成员变量包括:异常类型StringtypeName,异常类型类Classtype。当然,上述服务端容器的数据格式仅仅用作示例,本领域技术人员根据实际需求采用任一种数据格式都是可行的,本申请对此无需加以限制。步骤203,为客户端配置文件中声明的服务接口创建动态代理类,并生成所述服务接口的策略配置信息;其中,所述服务接口可以包括工作流数据持久化服务接口,所述策略配置信息可以包括工作流数据持久化的策略配置信息。所述服务信息与服务接口具有对应关系,所述工作流数据持久化服务信息与工作流数据持久化服务接口是相对应的。动态代理类是利用java的反射机制生成。在目前的Java开发包中包含了对动态代理的支持.其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,HelloWorld接口定义的业务方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是InvocationHandler接口实现。代码如下:业务接口:InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:测试代码:首先获取一个业务接口的实现对象;获取一个InvocationHandler实现,此处是HelloWorldHandler对象;创建动态代理对象;通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl.sayHelloWorld()方法前后输出两句字符串。运行测试类输出如下:beforemethodinvoke!HelloWorld!aftermethodinvoke!此处Test类中的方法调用代码比较多,在实际应用中可以通过配置文件来来简化客户端的调用实现。在具体实现中,可以根据客户端配置XML(客户端配置文件,通常为XML文件),为XML中声明的服务接口创建动态代理类,并配置事件策略eventName,存储策略storeRule,路由策略routeRule,服务实现地址endpointUrl,调用策略invokeType,回调地址callbackUri等工作流数据持久化的策略。具体而言,所述工作流数据持久化的策略可以包括:表示事件发生时,执行的行为动作的事件策略eventName;表示存储信息时,采用某种存储方式的存储策略storeRule;表示消息传递的路由机制的路由策略routeRule;表示接口实现类所在的位置的服务实现地址endpointUrl;表示事件信息的调用方式的调用策略invokeType;和/或,表示消息被消费成功后,自动回调发起方的地址的回调地址callbackUri。当然,上述策略配置仅仅用作示例,本领域技术人员根据实际需求采用任一种策略配置都是可行的,本申请对此无需加以限制。在本申请的一种优选实施例中,在所述步骤103之后,可以执行如下步骤:步骤204,将所述动态代理类注册到客户端容器中。在具体实现中,将动态代理类注册到客户端容器中后,在客户端后续使用的时候,可以直接从容器中获取。步骤205,获得需要进行持久化的目标工作流数据;作为本申请实施例具体应用的一种示例,所述步骤205可以包括如下子步骤:子步骤S11、流程实例开始流转,遇到需要保存数据的节点,将节点实例的数据保存到流程上下文中指定的有序队列中;子步骤S12、流程实例流转结束,获取所述有序队列中的节点实例数据为需要进行持久化的目标工作流数据。步骤206、调用所述工作流数据持久化服务接口获得其动态代理类,并在所述动态代理类中将所述目标工作流数据组装成事件;在具体实现中,可以在调用所述工作流数据持久化服务接口之前,在预设的事务管理器中启动事务,调用本地业务数据库操作,然后再调用工作流数据持久化服务接口。其中,所述事务即指本地业务数据库事务,,以出差借款申请为例,其中,出差的地点,时间,天数,事由组成的出差表单,就是业务数据,调用本地业务数据库操作即指保存出差表单的业务数据。在本申请的一种优选实施例中,所述事件为统一事件;所述步骤206具体可以包括如下子步骤:子步骤S21、从所述客户端容器中调用工作流数据持久化服务接口;子步骤S22、由所述工作流数据持久化服务接口调用对应的动态代理类;子步骤S23、在所述动态代理类中,根据所述服务接口实现类中的方法以及方法中声明的参数类型,以及,工作流数据持久化的策略配置信息,将所述目标工作流数据按照预置的第二数据格式组装成统一事件。以下通过一个简单的示例说明调用所述工作流数据持久化服务接口获得其动态代理类的原理:流程引擎A类中调用com.ali.xbpm.eda.test.EdaWorkflowService接口。A类中的一段代码如下:EdaWorkflowServiceworkflowClient=(EdaWorkflowService)ContextFactory.get(“workflowClient”);workflowClient.storeProcess(bpmProcInst,contextMap,queue)在上段代码中可以发现,EdaWorkflowService这个工作流持久化服务接口,是通过客户端容器ContextFactory中获取的。由于已经通过客户端配置,为这个服务接口创建了动态代理类。所以从ContextFactory中获取的是动态代理类,而非真正的服务接口实现类。由于动态代理类是根据客户端配置文件,利用java的反射机制生成的。它实际上是接口的一个实现类。在利用java的反射机制生成的过程中,就将工作流数据持久化的策略配置信息(即各种策略配置)读取进来,保存在动态代理类的成员变量中。也因为动态代理类,其实就是接口的另一个实现类,所以能接收到服务接口实现类中的方法以及方法中声明的参数类型的数据。以下通过一段代码说明java的反射方法:JavaMethod类中的方法:java.lang.reflect.Method.invoke(Objectobj,Object...args)throwsIllegalAccessException,IllegalArgumentException,InvocationTargetException其中,obj就是接口类名,args为实际的参数列表。作为本申请实施例具体应用的一种示例,所述预置的第二数据格式可以包括:统一事件对象UniformEvent:其中,成员变量包括:事件序列IDeventId,事件名称eventName,事件回调地址callbackUri,事件创建时间createdTime,事件发送时间sendedTime,事件上带的统一消息对象UniformMessage;统一消息对象UniformMessage:其中,成员变量包括:消息IDmessageId,消息头UniformMessageHeader,消息体UniformMessagePlayload,消息处理结果返回值Objectresponse;统一消息体对象UniformMessagePlayload:其中,成员变量包括:参数列表Object[]params;统一消息头对象UniformMessageHeader:其中,成员变量包括:事件的名字eventName,事件回调地址callbackUri,消息产生的时间createdTime,消息发送时间sendedTime,服务端实现地址endpointUrl,方法名methodName,消息计划消费的时间planTime,存储规则storeRule,路由规则routeRule,超时时间timeout,失败重试次数retry,调用方式:同步/异步invokeType。当然,上述事件的组装方法仅仅用作示例,本领域技术人员根据实际需求采用任一种组装方法都是可行的,本申请对此无需加以限制。步骤207,按照所述工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作。在本申请的一种优选实施例中,所述步骤207可以包括如下子步骤:子步骤S31、获取依据所述调用策略配置的事件中消息的调用方式,若为同步调用,则触发所述事件,所述事件具有事件名称;子步骤S32、根据所述事件名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;子步骤S33、在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;子步骤S34、根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;子步骤S35、调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中。在本申请的另一种优选实施例中,所述步骤207可以包括如下子步骤:子步骤S41、获取依据所述调用策略配置的事件中消息的调用方式,若为异步调用,则创建事务同步器,并在所述事务管理器中注册事务同步器;利用事务同步器,目的就是为了保证本地业务数据和(本地或远程)的工作流数据能够具有事务一致性。子步骤S42、提交事务,调用事务同步器,根据所述存储策略保存事件中的消息,然后将事件加入异步队列中;子步骤S43、异步队列监听器监听到有事件加入时,触发所述事件;子步骤S44、根据所述事件的名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;子步骤S45、在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;子步骤S46、根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;子步骤S47、调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中;子步骤S48、若所述服务接口实现类调用成功,则根据所述存储策略,删除保存过的事件消息,然后根据所述回调地址,回调发起方通知操作成功;子步骤S49、若所述服务接口实现类调用失败,则根据所述回调地址,回调发起方执行补偿业务操作。为使本领域技术人员更好地理解本申请实施例,以下结合图3所示的应用本申请实施例进行工作流数据持久化操作的流程图,通过一个具体示例进一步说明。步骤一:根据服务端配置XML,将XML中声明的服务注册到服务容器(即服务端容器)中(图3中步骤1(1))。其中,服务端容器的数据格式包括:ServiceRegistry类:服务端容器及注册类成员变量:staticMap<String,ServiceInfo>,表示包含各种不同名称的服务信息集合。ServiceInfo服务信息:描述服务接口实现的信息。成员变量:服务的提供者(即接口的实现类),暴露的服务接口(可以是多个接口),服务的地址(String类型serviceURI),方法信息集合(Map<String,OperationInfo>)。OperationInfo方法信息:描述方法的信息。成员变量:方法名,方法参数信息集合(List<ParameterInfo>),方法返回值信息(ReturnInforeturnInfo),方法异常信息集合(List<ExceptionInfo>),方法对象(Methodmethod)。ParameterInfo方法参数信息:描述方法参数的信息。成员变量:参数类型(StringtypeName),参数类型类(Classtype)ReturnInfo方法返回值信息:描述方法的返回值信息。成员变量:返回值类型(StringtypeName),返回值类型类(Classtype)ExceptionInfo方法异常信息:描述方法的异常信息。成员变量:异常类型(StringtypeName),异常类型类(Classtype)以下提供一种本申请实施例在具体实现中所使用的服务端配置文件的代码示例:步骤二:根据客户端配置XML,为XML中声明的接口创建动态代理,配置事件策略eventName,存储策略storeRule,路由策略routeRule,服务实现地址endpointUrl,调用策略invokeType,回调地址callbackUri。(图3中步骤1(2))其中,事件策略:表示事件发生时,执行的行为动作。包括本地方法调用事件,远程mina调用事件等。存储策略:表示存储信息时,采用哪种存储方式。包括berkeleyDb存储,mysql存储等。路由策略:表示消息传递的路由机制。例如:本地Java虚拟机内流转,远程流程中心流转。服务实现地址:表示接口实现类所在的位置。可以是本地,也可以是远程。调用策略:表示事件信息的调用方式。例如:同步调用(sync),异步调用(async),异步可靠调用(asyncrely)等。回调地址:表示消息被消费成功后,自动回调发起方的地址。以下提供一种本申请实施例在具体实现中所使用的客户端配置文件的代码示例:步骤三:流程实例开始流转,遇到需要保存数据的节点,将节点实例(即活动实例)数据保存到流程上下文中指定的有序队列中。(图3中步骤3、4)步骤四:流程实例流转结束。开始启动事务,调用本地业务数据库操作,然后再调用工作流数据持久化服务接口。此接口就是步骤二中声明的接口。实际调用的是接口的动态代理类。所述工作流数据持久化服务接口从所述流程上下文的有序队列中获取到相应的节点实例数据。(图3中步骤5、6、7、8、9)步骤五:动态代理类中根据接口的方法,参数,组装成统一事件。(图3中步骤10)统一事件的数据结构如下所示:UniformEvent:统一事件,是支持后续事件策略,路由策略,消息存储策略,调用策略的载体对象。事件对象在跨系统调用时不传递。成员变量有:事件序列ID(eventId),事件的名字(eventName,后续事件策略根据此名称决定),事件回调URI(callbackUri,即消息成功或失败后的回调地址),事件创建时间(createdTime),事件发送时间(sendedTime),事件上带的消息对象(UniformMessage)。UniformMessage:统一消息,用来跨系统传递数据的载体。成员变量有:消息ID(messageId),消息头(UniformMessageHeader),消息体(UniformMessagePlayload),消息处理结果返回值(Objectresponse)。UniformMessagePlayload:统一消息体对象。成员变量有:参数列表(Object[]params)UniformMessageHeader:统一消息头对象。成员变量有:事件的名字[eventName],事件回调URI[callbackUri],消息产生的时间[createdTime],消息发送时间[sendedTime],服务端实现地址[endpointUrl],方法名[methodName],消息计划消费的时间[planTime],存储规则[storeRule],路由规则[routeRule],超时时间[timeout],失败重试次数[retry],调用方式:同步/异步[invokeType]。以出差借款申请为例子。流程实例启动后,经过开始节点,主管审批节点后进入等待状态。此时调用了工作流持久化服务接口来保存工作流数据,代码示例如下:EdaWorkflowServiceworkflowClient=(EdaWorkflowService)ContextFactory.get(“workflowClient”);workflowClient.storeProcess(bpmProcInst,contextMap,queue)参数列表有:流程实例bpmProcInst,上下文Map数据contextMap,queue队列里是活动实例数据(主管审批节点的活动实例数据)组装的统一事件对象如下:publicclassUniformEvent{privateStringeventId;//事件序列ID[系统自动生成的唯一id]privateStringeventName;//事件的名字[步骤二中读取的配置]privateStringcallbackUri;//事件回调URI[步骤二中读取的配置]privatelongcreatedTime;//事件创建时间[系统自动生成当前时间]privatelongsendedTime;//事件发送时间[系统自动生成当前时间]privateUniformMessagemessage;//事件上带的消息对象[动态代理类里组装]动态代理类里组装指的是下面这个对象:publicclassUniformMessageimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringmessageId;//消息ID,UUID字符串[系统自动生成的唯一id]privateUniformMessageHeaderheader;//消息头[代理类里组装]privateUniformMessagePlayloadplayload;//消息体[代理类里组装]即参数列表有:流程实例bpmProcInst,上下文Map数据contextMap,queue队列里是活动实例数据(主管审批节点的活动实例数据)步骤六:根据事件中消息的调用方式(即调用策略),调用事件引擎调度类。(图3中步骤11)如果是同步调用,则触发事件,根据具体的事件名称,调用不同的事件监听实现类(即事件策略)(图3中步骤12.3、13.1)。然后转步骤九。如果是异步调用,则创建事务同步器,并在事务管理器中注册事务同步器(图3中步骤12、12.1、12.2)。然后转步骤七。步骤七,提交事务,调用事务同步器,保存事件中的消息(根据存储消息策略,可选择mysql和berkeleydb进行消息的存储),然后将事件加入异步队列中(图3中步骤13、14、15、16)。步骤八,异步队列监听器,监听到有事件加入,则触发事件。根据具体的事件名称,调用不同的事件监听实现类(即事件策略)(图3中步骤17)。步骤九,在事件监听实现类中,根据路由策略,找到本地或远程的服务实现类地址(图3中步骤18)。步骤十,根据服务实现类地址,从服务端容器中找到注册过的接口真正实现类。然后调用这个实现类持久化工作流数据,将工作流数据保存至本地或远程的工作流数据库中(图3中步骤19,20)。步骤十一:调用成功后,如果调用方式是异步,根据存储策略,删除保存过的事件消息。然后根据回调地址,自动回调发起方通知成功;调用失败后,根据回调地址,自动回调发起方做补偿业务操作(图3中步骤21、22)。以下提供一段实现上述步骤六至步骤十一的代码示例:应用本申请实施例,可以根据工作流业务的情况,只需要简单的修改配置文件,即可自由选择事件策略,消息存储策略,路由策略,调用策略等工作流数据持久化服务策略,节省了维护成本,大大增强了工作流产品的扩展性。需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。参照图4,示出了本申请的一种工作流数据持久化的装置实施例的结构框图,具体可以包括如下模块:服务端配置模块401,用于提取服务端配置文件中声明的服务信息;其中,所述服务信息包括工作流数据持久化服务信息;客户端配置模块402,用于为客户端配置文件中声明的服务接口创建动态代理类,并生成所述服务接口的策略配置信息;其中,所述服务接口包括工作流数据持久化服务接口,所述策略配置信息包括工作流数据持久化的策略配置信息;工作流数据获取模块403,用于获得需要进行持久化的目标工作流数据;代理类调用模块404,用于调用所述工作流数据持久化服务接口获得其动态代理类,并在所述动态代理类中将所述目标工作流数据组装成事件;事件执行模块405,用于按照所述工作流数据持久化策略的配置信息运行所述事件,获得所述事件对应的工作流数据持久化服务信息,并按照所述工作流数据持久化服务信息对目标工作流数据进行持久化操作。在具体实现中,所述工作流数据持久化服务信息可以包括:服务接口的实现类,服务接口实现类的地址,服务接口实现类中的方法以及方法中声明的参数类型;在本申请的一种优选实施例中,所述的装置还可以包括如下模块:服务容器注册模块,与所述服务端配置模块401相连,用于将所述服务信息按照预置的第一数据格式注册到服务端容器中。作为本申请实施例具体应用的一种示例,所述预置的第一数据格式可以包括如下内容:服务容器及注册类ServiceRegistry,其中,成员变量包括:表示包含各种不同名称的服务信息集合staticMap<String,ServiceInfo>;服务接口实现的信息ServiceInfo,其中,成员变量包括:服务接口的实现类,暴露的服务接口,服务接口实现类的地址serviceURI,服务接口实现类中的方法信息集合Map<String,OperationInfo>;服务接口实现类中方法的信息OperationInfo,其中,成员变量包括:方法名,方法中声明的参数信息集合List<ParameterInfo>,方法返回值信息ReturnInforeturnInfo)方法异常信息集合List<ExceptionInfo>,方法对象(Methodmethod);方法中声明的参数信息ParameterInfo,其中,成员变量包括:参数类型StringtypeName,参数类型类Classtype;方法返回值信息ReturnInfo,其中,成员变量包括:返回值类型StringtypeName,返回值类型类Classtype;方法异常信息ExceptionInfo,其中,成员变量包括:异常类型StringtypeName,异常类型类Classtype。在本申请的一种优选实施例中,所述的装置还可以包括如下模块:客户端容器注册模块,与所述客户端配置模块相连,用于将所述动态代理类注册到客户端容器中。作为本申请实施例具体应用的一种示例,所述工作流数据持久化策略的配置信息可以包括:表示事件发生时,执行的行为动作的事件策略eventName;表示存储信息时,采用某种存储方式的存储策略storeRule;表示消息传递的路由机制的路由策略routeRule;表示接口实现类所在的位置的服务实现地址endpointUrl;表示事件信息的调用方式的调用策略invokeType;和/或,表示消息被消费成功后,自动回调发起方的地址的回调地址callbackUri。在具体实现中,所述事件为统一事件;所述代理类调用模块404可以包括如下子模块:服务接口调用子模块,用于从所述客户端容器中调用工作流数据持久化服务接口;动态代理类提取子模块,用于由所述工作流数据持久化服务接口调用对应的动态代理类;事件组装子模块,用于在所述动态代理类中,根据所述服务接口实现类中的方法以及方法中声明的参数类型,以及,工作流数据持久化的策略配置信息,将所述目标工作流数据按照预置的第二数据格式组装成统一事件。作为本申请实施例具体应用的一种示例,所述预置的第二数据格式可以包括如下内容:统一事件对象UniformEvent:其中,成员变量包括:事件序列IDeventId,事件名称eventName,事件回调地址callbackUri,事件创建时间createdTime,事件发送时间sendedTime,事件上带的统一消息对象UniformMessage;统一消息对象UniformMessage:其中,成员变量包括:消息IDmessageId,消息头UniformMessageHeader,消息体UniformMessagePlayload,消息处理结果返回值Objectresponse;统一消息体对象UniformMessagePlayload:其中,成员变量包括:参数列表Object[]params;统一消息头对象UniformMessageHeader:其中,成员变量包括:事件的名字eventName,事件回调地址callbackUri,消息产生的时间createdTime,消息发送时间sendedTime,服务端实现地址endpointUrl,方法名methodName,消息计划消费的时间planTime,存储规则storeRule,路由规则routeRule,超时时间timeout,失败重试次数retry,调用方式:同步/异步invokeType。在本申请的一种优选实施例中,所述事件执行模块405可以包括如下子模块:第一事件触发子模块,用于获取依据所述调用策略配置的事件中消息的调用方式,若为同步调用,则触发所述事件,所述事件具有事件名称;事件监听子模块,用于根据所述事件名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;路由子模块,用于在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;实现类定位子模块,用于根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;持久化操作子模块,用于调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中。作为本申请的另一种优选实施例,所述的装置还可以包括事务启动模块,用于在预设的事务管理器中启动事务;在这种情况下,所述事件执行模块405可以包括如下子模块:事务同步器创建子模块,用于获取依据所述调用策略配置的事件中消息的调用方式,若为异步调用,则创建事务同步器,并在所述事务管理器中注册事务同步器;事务提交处理子模块,用于提交事务,调用事务同步器,根据所述存储策略保存事件中的消息,然后将事件加入异步队列中;第二事件触发子模块,用于异步队列监听器监听到有事件加入时,触发所述事件;事件监听子模块,用于根据所述事件的名称获取相应的事件监听实现类,所述事件监听实现类依据所述事件策略配置生成;路由子模块,用于在所述事件监听实现类中,根据所述路由策略,查找位于本地或远程的服务接口实现类的地址;实现类定位子模块,用于根据所述服务接口实现类的地址,从服务端容器中找到相应的服务接口实现类;持久化操作子模块,用于调用所述服务接口实现类,将所述目标工作流数据保存在本地或远程的工作流数据库中;调用成功处理子模块,用于在所述服务接口实现类调用成功时,则根据所述存储策略,删除保存过的事件消息,然后根据所述回调地址,回调发起方通知操作成功;调用失败处理子模块,用于在所述服务接口实现类调用失败,则根据所述回调地址,回调发起方执行补偿业务操作。在具体实现中,所述工作流数据获取模块403包括:数据生成子模块,用于流程实例开始流转,遇到需要保存数据的节点,将节点实例的数据保存到流程上下文中指定的有序队列中;数据提取子模块,用于流程实例流转结束,获取所述有序队列中的节点实例数据为需要进行持久化的目标工作流数据。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。以上对本申请所提供的一种工作流数据持久化的方法和一种工作流数据持久化的装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1