CN102662656A - 一种程序结构插件化方法及系统 - Google Patents

一种程序结构插件化方法及系统 Download PDF

Info

Publication number
CN102662656A
CN102662656A CN2012100684524A CN201210068452A CN102662656A CN 102662656 A CN102662656 A CN 102662656A CN 2012100684524 A CN2012100684524 A CN 2012100684524A CN 201210068452 A CN201210068452 A CN 201210068452A CN 102662656 A CN102662656 A CN 102662656A
Authority
CN
China
Prior art keywords
module
variable
block size
less
control
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN2012100684524A
Other languages
English (en)
Inventor
骆群
马嘉欢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Original Assignee
BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd filed Critical BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Priority to CN2012100684524A priority Critical patent/CN102662656A/zh
Publication of CN102662656A publication Critical patent/CN102662656A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明涉及一种程序结构插件化方法,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其细分业务流程,接受用户请求,初始化请求,通过判断容器类中是否有功能实现类,并当有时执行该类的控制方法,将环境变量和javaBean放入环境和服务运行Bean中,返回到判断步骤,并将所有执行结果放到响应中;在反复循环后,当判断容器类中没有功能实现类时,结束控制流程。本发明对业务流程进行适当粒度的细分,增加了程序复用性、实现了可插拔式程序功能,完善了程序的性能整合、配置,优化了程序开发/设计的性能,从而解决了复杂业务流程的拆分、组装,以及大型项目中代码重复率高、设计混乱、结构不清晰、不统一的问题。

Description

一种程序结构插件化方法及系统
技术领域
本发明涉及程序结构插件化方法,尤其涉及在spring开源框架下进行扩展的性能整合配置、优化程序开发/设计性能的技术,属于计算机领域。 
背景技术
进入21世纪,随着计算机处理器的爆炸式增长,带来软件系统的诸多问题,如软件系统的复杂性等问题。面对不断变化的性能要求,通常的软件系统往往过于僵硬、脆弱、不易复用、维护困难。 
一方面,Java编程语言生逢其时(互联网的兴起),并且吸收总结了前人的经验教训,反映了最新技术,受到广泛的欢迎和采用。自1995年问世以来,其成功几乎任何编程语言都无法媲美,其解决了程序开发过程中很多的问题。其中,spring开源框架,应用java面向对象的完美体现,综合运用面向对象语言的继承,多态和良好的封装性,使的系统的程序设计直接能够以插件的形式摆在开发者面前,为客户端程序员提供了良好的代码结构和业务流程设计。 
但是,已有的spring开源框架在使得系统程序结构插件化的技术上,还存在如下不足:虽然极大的简化了客户端程序员对于复杂业务流程的程序的设计过程,但是它对事务的控制方面还有欠佳的表现,比如,对事务的控制主要是应用spring的配置型的事务控制,但是笔者认为这方面的功能有待于改进;又比如,主要是针对基于spring框架进行插件的配置,对于非spring项目,缺乏相关配置方法的说明(实际上,这个框架既是基于spring的,但又是可以脱离spring进行扩展)。从而导致了大型项目中,代码重复率高,设计混乱,结构不清晰,不统一的问题。 
发明内容
为克服现有技术的上述缺陷,本发明提供了一种程序结构插件化方法,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于:对整体的业务流程准确定位出业务处理阶段;对整体的业务流程进行细粒度的划分,分割成可以插拔式的功能模块的插件plugin;根据业务流程的前后功能模块的关系,执行相应的控制模块,即全关系控制模块llPluginSuite、与关系控制模块AndPluginSuite、互斥关系控制模块OrPluginSuite,完成功能模块的插件plugin执行控制,获得结果并返回。 
进一步的,该业务流程的前后功能模块,称模块A、模块B,其关系为,(1)如果模块A执行成功,则执行模块B,如果模块A执行失败,则不执行模块B,为逻辑中的“与”And关系;(2)如果模块A执行成功,则不执行模块B,如果模块A执行不成功,则执行模块B,该关系是一种或者模块A执行,或者模块B执行的互斥关系,为逻辑中的“互斥”Or关系;(3)不管模块A执行与否,都执行模块B,即模块A与模块B没有关系、但有先后的执行顺序,为“全”All关系。 
进一步的,全关系控制模块AllPluginSuite、与关系控制模块AndPluginSuite、互斥关系控制模块OrPluginSuite,依次对应所述全关系All、与关系And、互斥关系Or。 
进一步的,当功能模块的插件plugin处于全关系时,执行全关系控制模块AllPluginSuite:在spring配置文件中配置模块属性包含的插件plugin;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。 
进一步的,当功能模块的插件plugin处于与关系时,执行与关系控制模块AndPluginSuite:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。 
进一步的,当功能模块的插件plugin处于互斥关系时,执行互斥关系控制模块OrPluginSuite:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。 
另一方面,本发明提供一种程序结构插件化方法,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于:接受用户请求,初始化请求;判断容器类中是否有功能实现类,如果有,则执行该类的控制方法,并将环境变量和javaBean放入环境和服务运行Bean中,返回到判断步骤,并将所有执行结果放到响应中;反复循环后,当判断容器类中没有功能实现类时,则结束控制流程。 
进一步的,容器类包括全关系容器类、与关系容器类、互斥关系容器类,完成功能模块的插件plugin控制。 
进一步的,当功能模块的插件plugin处于全关系时,执行全关系容器类:在spring配置文件中配置模块属性包含的插件plugin;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。 
进一步的,当功能模块的插件plugin处于与关系时,执行与关系容器类:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。 
进一步的,当功能模块的插件plugin处于互斥关系时,执行互斥关系容器类:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;接着,执行控制方法,初始化变量;进一步判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。 
另一方面,提供一种程序结构插件化系统,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于,包括:总控制模块,控制整个流程的运行;初始化模块:接受用户请求,初始化请求;第一判断模块,判断容器类中是否有功能实现类,如果有,则由第一控制模块来执行该类的控制方法,并将环境变量和javaBean放入环境和服务运行Bean中,返回到判断步骤,并将所有执行结果放到响应中;反复循环后,当判断容器类中没有功能实现类时,则结束控制流程。 
进一步的,容器类包括全关系容器类、与关系容器类、互斥关系容器类,完成功能模块的插件plugin控制。 
进一步的,当功能模块的插件plugin处于全关系时,执行全关系容器类:在spring配置文件中配置模块属性包含的插件plugin;由第二控制模块,执行控制方法,初始化变量;第二判断模块,判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。 
进一步的,当功能模块的插件plugin处于与关系时,执行与关系容器类:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;第二控制模块,执行控制方法,初始化变量;第二判断模块,判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后第三判断模块,判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。 
进一步的,当功能模块的插件plugin处于互斥关系时,执行互斥关系容器类:用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;第二控制模块,执行控制方法,初始化变量;第二判断模块,判断变量是否小于模块大小;当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;然后第三判断模块,判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。 
本发明通过对业务流程进行适当粒度的细分,极大的增加了程序的复用性,实现了可插拔式的程序功能,从而完善了程序的性能整合、配置,优化了程序开发/设计的性能。采用本发明提供的方法和系统,在spring开源框架之下,进行扩展,通过对可配置性的功能模块进行整合,可以完成更为复杂的、完整的业务功能的程序设计。 
通过本发明的上述技术方案,解决了对复杂业务流程的拆分,组装,解决了大型项目中,代码重复率高,设计混乱,结构不清晰,不统一的技术问题。 
并且,可通过本发明提供的配置方式,快速搭建出系统的雏形,进一步解决了传统IT系统移动化开发方式中工作量大,成本高,风险高的问题,可以帮助开发人员快速进入业务设计阶段和需求实现阶段。 
本发明适用于依托于spring框架的,业务较为复杂的,程序复用性要求较高的系统领域当中,对webservice开发过程中的业务流程(主体功能部分)的支持,尤为出色。 
附图说明
图1为最简单的两个功能/业务模块关系图。 
图2多个功能/业务模块关系图。 
图3为本发明所涉及的类的继承关系图。 
图4为本发明具体实施方式的容器类AllPluginSuite中执行的流程图。 
图5为本发明具体实施方式的容器类AndPluginSuite中执行的流程图。 
图6为本发明具体实施方式的容器类OrPluginSuite中执行的流程图。 
图7为本发明具体实施方式的参数类的类结构和继承关系图。 
图8是本发明具体实施方式的整体执行流程图。 
具体实施方式
本发明主要通过对业务流程进行适当粒度的细分,极大的增加了程序的复用性,实现了可插拔式的程序功能,从而完善了程序的性能整合、配置,优化了程序开发/设计的性能。本发明的系统和方法在spring开源框架之下,进行扩展,通过对可配置性的功能模块进行整合,可以完成更为复杂的、完整的业务功能的程序设计。 
在B/S系统,一般都采用MVC“Model-View-Controller”(模型-视图-控制器)的设计模式(MVC应用程序总是由这三个部分组成),Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。传统的设计中,对M层(服务层)的设计对每个业务的功能模块,一般是按照业务流程进行编码。当然,如果业务流程简单的话,按照业务流程编码无可厚非。但是如果业务流程特别复杂的话,那么我们就有必要对整体的业务进行细粒度的划分,而细分出来的业务模块之间需要交流,那么控制代码就会很多,会造成程序结构的混乱。这样的代码对于读编码的人完全可以说成是一种灾难,对程序的可读性和扩展性造成非常大的困难,由此会造成对程序的后期维护成本的增高。特别是系统交割到了维护人员的手中以后,如果用户的业务的增加和变化比较频繁 ,那么代码维护起来成本是会非常高的。所以,在对整体业务进行细粒度的划分以后,对于他们的控制会成为非常大的一个问题。 
针对这种情况,本发明改进了整体业务的细粒度划分和控制,其能很清晰的对划分好的细粒度的业务进行良好的结构控制。一方面,使的业务流程清晰,一目了然,看到代码如同看到系统的流程图一样,能够准确定位出业务处理的阶段。另一方面,把业务的流程分割成了可以插拔式的插件形式,针对用户可能会有较多的业务增加和变化的情况,可以很方便的增加或者取消某个功能。 
如果把一个整体业务划分成多个业务模块A,B,C…,那么按照先后的顺序,可以抽象出来所有业务模块之间的关系为图1所示。 
图1中,是最简单的两个功能模块之间的关系描述,它说明依次执行A模块,B模块,C模块,……,并且后面的模块只与他前面的模块有关系(即前面的模块执行的结果,决定他后面的模块是否被执行)。 
图2中,是描述多个模块之间存在的关系,它说明按照前后顺序,第N+1个模块的执行与否与前面N个模块之间都可能存在关系,决定于前面N个模块给第N+1个模块传达的状态消息是什么。 
如果上面的功能模块很多的话,放到一个类中进行编码,那么很容易由于控制代码很多,造成程序流程混乱,可读性差的现象。而且在程序设计中,由于缺乏一个标准,会浪费大量的时间在区分划分功能模块,进行流程控制之上。 
下面将具体描述本发明的系统和方法,是如何处理这种复杂的关系的。 
首先,对于第一种情况,无碍乎有以下几种情况: 
1,如果A执行成功,则执行B,如果A执行失败,则不执行B,那么我们可以用逻辑中的and关系来描述这种情况;
2,如果A执行成功,则不执行B,如果A执行不成功,则执行B,该关系是一种或者A执行,或者B执行的互斥关系,那么我们可以用逻辑中的or关系来表示(和数学中的or不太一样,这里仅表示互斥关系或叫“或”关系);
3,不管A执行与否,都执行B,即A与B没有什么关系,A与B都要执行,但是一般来说A与B之间有先后的执行顺序,我们可以用All这个关系来说明。  
那么根据如上的关系,我们可以在程序中设计出几个专门控制流程的类,他们就像是一个容器,我们将所有的需要执行的功能模块放到这个容器中,这个容器具有控制功能,能够让其中的功能模块遵循and,or和all的关系来执行。
对此,本发明的系统和方法通过设计出一个能够处理同一个类型的参数的接口,该接口定义一个接口方法,该方法需要指定一个参数,所有的功能模块都实现这个接口类,利用这个方法和这个参数,这样这个参数就可以在多个功能模块之间进行传递,就可以将多个继承自统一接口的功能模块,无缝的进行连接。 
当然,这个参数的作用还不止如此,这个参数最大的作用是:1,由于将各个模块中所需要的参数都封装到了这个参数中,这个参数对象在不同的插件plugin中进行传递,每个功能模块的插件plugin都能对参数进行补充或者状态的修改,通过这个,就能够对其他的功能模块的插件plugin进行干预;2,将每一个功能模块的插件plugin的输出结果可以放到这个参数对象当中,最终可以通过此对象获取最终需要返回给前台的结果。针对这两种情况,本发明设计了两种类型的类,一种作为是作为容器的类,可以用来控制功能模块插件plugin的执行次序;另一种类用作实现真正的功能模板的类,具体的实现功能的类,需要继承于此类。 
类的继承如图3所示。业务流程插件和业务流程执行框架实现了相同的接口IPlugin,接口定义了入口execute方法; AbstractPlugin作为实现接口IPlugin的第一级抽象类,用于存放业务流程插件和业务流程执行框架的公共属性和方法;AbstractPluginSuite作为业务流程执行框架的抽象类,定义了业务流程执行框架的公共属性和方法,重点定义了执行单个业务流程插件的方法execute方法供框架子类使用,同时定义了doexecute方法供具体业务流程执行框架实现;AllPluginSuite、AndPluginSuite、OrPluginSuite这三个业务流程执行框架实现了doexecute方法对应实现业务中常用的三种业务执行流程类型:全部执行、全部成功才成功、任一成功就成功,供配置业务流程使用;VasspPlugin为业务流程插件的抽象类,用于存放业务流程插件的公共属性和方法,实现了execute方法,定义了doexecute抽象方法供具体业务流程插件实现,其余业务流程插件均继承自此方法;具体的业务流程插件实现doexecute方法,在其中实现具体的业务流程。 
当控制方法/模块为上述第三种流程:不管A执行与否,都执行B,即A与B没有什么关系,A与B都要执行,但是一般来说A与B之间有先后的执行顺序,我们可以用All这个关系来说明。此时,通过All容器类来控制功能模块Plugin的流程,如图4所示容器类AllPluginSuite中执行流程。流程开始Begin,接着,在spring配置文件中配置模块(组件)Module属性包含的功能模块plugin,再进入执行定义的DoExecute方法。Spring中回叫Callback模式和模板Template模式合用,随处可见,而该doExecute方法就是HibernateTemplate模板类中的一个核心的方法,这个核心的方法采用模板方法完成相关的固定操作:建立连接,执行操作,释放连接。其中的具体步骤通过回调传入的对象来完成,这个对象就是实现了Callback接口的类。进入doExecute方法处理,先声明初始化变量i=0,进入模块(组件)大小(尺寸)Module.size的判断,当i小于模块(组件)大小(尺寸)时,判断为真,执行模块(组件)获得Modules.get、目标(对象或变量)执行方法,并且i++(i加1),并返回到判断步骤,反复循环,直到i小于模块(组件)大小(尺寸)不成立(不小于模块(组件)大小(尺寸)时),判断结果为假,结束该All控制流程。 
当控制方法/模块为上述第一种流程:如果A执行成功,则执行B,如果A执行失败,则不执行B,那么我们可以用逻辑中的and关系来描述这种情况。此时,通过And容器类来控制功能模块Plugin的流程,如图5所示容器类容器类AndPluginSuite中执行流程。流程开始Begin,接着,在spring配置的xml文件中初始化模块(组件)Module的属性,添加vassp的子类到模块(组件)Module中。再执行目标(对象)的DoExecute方法。进入doExecute方法处理,先声明初始化变量i=0,进入模块(组件)大小(尺寸)Module.size的判断,当i小于模块(组件)大小(尺寸)时,判断为真,执行模块(组件)获得Modules.get以及目标(对象或变量)的执行方法,并且i++(i加1),将结果赋值给布尔变量b。之后,判断执行结果b是否为真(b=true否),为真,则返回到之前的判断模块(组件)大小(尺寸)Module.size的判断步骤,反复循环,直到i小于模块(组件)大小(尺寸)不成立(不小于模块(组件)大小(尺寸)时),判断结果为假,结束该And控制流程。如果在步骤——判断执行结果b=true,当判断为假(不成立),则也结束该And控制流程。 
当控制方法/模块为上述第二种流程:如果A执行成功,则不执行B,如果A执行不成功,则执行B,该关系是一种或者A执行,或者B执行的互斥关系,那么我们可以用逻辑中的or关系来表示(和数学中的or不太一样,这里仅表示互斥关系)。此时,通过Or容器类来控制功能模块Plugin的流程,如图6所示容器类OrPluginSuite中执行流程。流程开始Begin,接着,在spring配置的xml文件初始化模块(组件)Module的属性,添加vassp的子类到模块(组件)Module中。再执行目标(对象)的DoExecute方法。进入doExecute方法处理,先声明初始化变量i=0,进入模块(组件)大小(尺寸)Module.size的判断,当i小于模块(组件)大小(尺寸)时,判断为真,执行模块(组件)获得Modules.get以及目标(对象或变量)的执行方法,并且i++(i加1),将结果赋值给布尔变量b。之后,判断执行结果b是否为真(b=true否),为真则结束该Or控制流程(容器类的执行);为假(结果错误false)则返回到之前的判断模块(组件)大小(尺寸)Module.size的判断步骤,反复循环,直到i小于模块(组件)大小(尺寸)不成立(不小于模块(组件)大小(尺寸)时),判断结果为假,结束该Or控制流程。 
参数类的类结构和继承关系如图7所示。此参数类贯穿于各个plugin的doexecute方法中,请求request用于初始化用户的请求参数,响应response用于返回给用户业务执行的输出结果,context(环境、上下文)是一个Map对象,用于存储用户需要的上下文环境变量,serviceRunBean用于存储各个业务模块(功能模块插件plugin)在业务运行的过程中的Bean类对象,是一个针对于具体业务的存储类。 
图8是本发明具体实施方式的整体执行流程图。首先,本方法/系统执行开始Begin,接受用户请求后,初始化请求request。接着判断容器类中是否有功能实现类,如果是有,则执行该类的do execute方法,执行完后将环境变量和java Bean放到context和serviceRunBean当中,将执行的所有结果放到响应response中则结束当前的do execute流程,继续返回到判断容器类中是否有功能实现类的步骤,如此循环。当判断容器类中是否有功能实现类的步骤,如果是否,则结束流程。 
由上述本发明的具体实施方式可知,通过对业务流程进行适当粒度的细 
分,极大的增加了程序的复用性,实现了可插拔式的程序功能(功能模块的插件、以及容器类对功能模块插件执行的流程控制)。对复杂业务流程的拆分,组装,使系统的程序设计直接能够以插件的形式摆在开发者面前,为客户端程序员提供良好的代码结构和业务流程设计性能(优化),增加程序的复用性、完善了程序的性能整合、配置。也就避免了大型项目中,代码重复率高,设计混乱,结构不清晰,不统一的缺陷。应用本发明提供的方法,实现可插拔式的程序功能,对于非常复杂的业务流程,将能够减少40%-50%的工作量,极大的提高了工作效率,降低了项目实施风险。
下列编写的具体的功能类,继承自VasspPlugin.java,实现public final Object execute(Object object) throws Exception方法 
通过编写的程序举例,在处理boss测订购可选销售品时的实现,作为本发明的具体实施方式的参考,在构建网络控制程序时,包括了插件化设计和类的调用、核心方法的执行情况等,实现的简化而清晰的流程控制方式:
package com.sitech.engine.server.plugin.boss;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sitech.engine.bo.IAbleOrderProdOfferQryBO;
import com.sitech.engine.bo.IProdOfferBO;
import com.sitech.outsys.intf.server.boss.bean.AbleOrderProdOfferInfo;
import com.sitech.outsys.intf.server.boss.bean.AbleOrderProdOfferQryRequest;
import com.sitech.outsys.intf.server.boss.bean.AbleOrderProdOfferQryResponse;
import com.sitech.vassp.plugin.VasspPlugin;
import com.sitech.vassp.plugin.VasspPluginBean;
import com.sitech.vassp.util.CodeConstants;
/**************
 * boss侧订购可选销售品时调用
 * author guohao
 *
 */
public class AbleOrderProdOfferQryPlugin extends VasspPlugin {
    private static final Log log = LogFactory.getLog(AbleOrderProdOfferQryPlugin.class);
    private IAbleOrderProdOfferQryBO ableOrderProdOfferQryBO;
    private IProdOfferBO prodOfferBO;  
    protected Boolean doexecute(VasspPluginBean pluginBean) throws Exception {
       AbleOrderProdOfferQryRequest request = (AbleOrderProdOfferQryRequest)pluginBean.request;
       AbleOrderProdOfferQryResponse response = (AbleOrderProdOfferQryResponse)pluginBean.response;     
       long startTime = System.currentTimeMillis();
       List<AbleOrderProdOfferInfo> infoList = ableOrderProdOfferQryBO.queryAbleOrderProdOfferInfo(request);
       long endtime = System.currentTimeMillis();
       if(request.getUserIDNo()!=null){
           log.info("用户编码:"+request.getUserIDNo());
       }
       if(request.getProdOfferCode()!=null){
           log.info("销售品:"+request.getProdOfferCode());
       }
       log.info("=========查询时间:"+(endtime-startTime)/1000.0+"秒=========");
       if(infoList!=null && infoList.size()>0){
           AbleOrderProdOfferInfo[] ableOrderProdOfferInfoArray = new AbleOrderProdOfferInfo[infoList.size()];
           infoList.toArray(ableOrderProdOfferInfoArray);       
           log.info("查询可订购销售品成功!");
      response.setResult(CodeConstants.SUCCESS);
           response.setResultDesc("查询可订购销售品成功!");        response.setAbleOrderProdOfferInfoArray(ableOrderProdOfferInfoArray);
           return Boolean.TRUE;
    }
       log.info("没有可订购销售品!");
       response.setResult(CodeConstants.OTHER);
       response.setResultDesc("没有可订购销售品!");    
       return Boolean.TRUE;
    }
    public IAbleOrderProdOfferQryBO getAbleOrderProdOfferQryBO() {
       return ableOrderProdOfferQryBO;
    }
    public void setAbleOrderProdOfferQryBO(
           IAbleOrderProdOfferQryBO ableOrderProdOfferQryBO) {
       this.ableOrderProdOfferQryBO = ableOrderProdOfferQryBO;
    }
    public IProdOfferBO getProdOfferBO() {
       return prodOfferBO;
    }
    public void setProdOfferBO(IProdOfferBO prodOfferBO) {
       this.prodOfferBO = prodOfferBO;
    }
}
在spring的配置文件中,配置下
<bean id="ableOrderProdOfferQryServicePlugin" class="com.sitech.common.plugin.AndPluginSuite">
       <property name="modules">
           <list>
              <ref bean="ableOrderProdOfferQryPlugin"/>
           </list>
       </property>
    </bean>
<bean id="ableOrderProdOfferQryPlugin"     class="com.sitech.engine.server.plugin.boss.AbleOrderProdOfferQryPlugin">
       <property name="ableOrderProdOfferQryBO" ref="ableOrderProdOfferQryBO" ></property>     
    </bean>  

Claims (16)

1.一种程序结构插件化方法,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于:
对整体的业务流程准确定位出业务处理阶段;
对整体的业务流程进行细粒度的划分,分割成可以插拔式的功能模块的插件plugin;
根据业务流程的前后功能模块的关系,执行相应的控制模块,即全关系控制模块AllPluginSuite、与关系控制模块AndPluginSuite、互斥关系控制模块OrPluginSuite,完成功能模块的插件plugin执行控制,获得结果并返回。
2.如权利要求1所述的方法,其特征在于:
业务流程的前后功能模块,称模块A、模块B,其关系为,
(1)如果模块A执行成功,则执行模块B,如果模块A执行失败,则不执行模块B,为逻辑中的“与”And关系;(2)如果模块A执行成功,则不执行模块B,如果模块A执行不成功,则执行模块B,该关系是一种或者模块A执行,或者模块B执行的互斥关系,为逻辑中的“互斥”Or关系;(3)不管模块A执行与否,都执行模块B,即模块A与模块B没有关系、但有先后的执行顺序,为“全”All关系。
3.如权利要求2所述的方法,其特征在于:
全关系控制模块AllPluginSuite、与关系控制模块AndPluginSuite、互斥关系控制模块OrPluginSuite,依次对应所述全关系All、与关系And、互斥关系Or。
4.如权利要求3所述的方法,其特征在于,当功能模块的插件plugin处于全关系时,执行全关系控制模块AllPluginSuite,步骤如下:
在spring配置文件中配置模块属性包含的插件plugin;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。
5.如权利要求3所述的方法,其特征在于,当功能模块的插件plugin处于与关系时,执行与关系控制模块AndPluginSuite,步骤如下:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。
6.如权利要求3所述的方法,其特征在于,当功能模块的插件plugin处于互斥关系时,执行互斥关系控制模块OrPluginSuite,步骤如下:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;
如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。
7.一种程序结构插件化方法, 其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于:
接受用户请求,初始化请求;
判断容器类中是否有功能实现类,如果有,则执行该类的控制方法,并将环境变量和javaBean放入环境和服务运行Bean中,返回到判断步骤,并将所有执行结果放到响应中;
反复循环后,当判断容器类中没有功能实现类时,则结束控制流程。
8.如权利要求7所述的方法,其特征在于,容器类包括全关系容器类、与关系容器类、互斥关系容器类,完成功能模块的插件plugin控制。
9.如权利要求8所述的方法,其特征在于,当功能模块的插件plugin处于全关系时,执行全关系容器类,步骤如下:
在spring配置文件中配置模块属性包含的插件plugin;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。
10.如权利要求8所述的方法,其特征在于,当功能模块的插件plugin处于与关系时,执行与关系容器类,步骤如下:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。
11.如权利要求8所述的方法,其特征在于,当功能模块的插件plugin处于互斥关系时,执行互斥关系容器类,步骤如下:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
接着,执行控制方法,初始化变量;
进一步判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;
如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。
12.一种程序结构插件化系统,其在浏览器/服务器B/S系统中,基于Spring框架的扩展,实现业务流程控制,其特征在于,包括:
总控制模块,控制整个流程的运行;
初始化模块:接受用户请求,初始化请求;
第一判断模块,判断容器类中是否有功能实现类,如果有,则由第一控制模块来执行该类的控制方法,并将环境变量和javaBean放入环境和服务运行Bean中,返回到判断步骤,并将所有执行结果放到响应中;
反复循环后,当判断容器类中没有功能实现类时,则结束控制流程。
13.如权利要求12所述的系统,其特征在于,容器类包括全关系容器类、与关系容器类、互斥关系容器类,完成功能模块的插件plugin控制。
14.如权利要求13所述的系统,其特征在于,当功能模块的插件plugin处于全关系时,执行全关系容器类:
在spring配置文件中配置模块属性包含的插件plugin;
由第二控制模块,执行控制方法,初始化变量;
第二判断模块,判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,返回到判断步骤,反复循环,直到变量小于模块大小不成立,判断结果为假,结束该控制流程。
15.如权利要求13所述的系统,其特征在于,当功能模块的插件plugin处于与关系时,执行与关系容器类:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
第二控制模块,执行控制方法,初始化变量;
第二判断模块,判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后第三判断模块,判断赋值后的执行结果是否为真,如果为真则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小不成立即为假、或者判断复制后的执行结果为假,则结束该控制流程。
16.如权利要求13所述的系统,其特征在于,当功能模块的插件plugin处于互斥关系时,执行互斥关系容器类:
用spring配置的xml文件初始化模块Module的属性,添加vassp的子类到模块Module中;
第二控制模块,执行控制方法,初始化变量;
第二判断模块,判断变量是否小于模块大小;
当变量小于模块大小时,为真,执行目标及模块获得方法,并且变量加1,将结果赋值;
然后第三判断模块,判断赋值后的执行结果是否为真,如果为真,则结束该控制流程;
如果判断赋值后的执行结果为假,则返回到判断变量是否小于模块大小的步骤,反复循环,直到变量小于模块大小为假,则结束该控制流程。
CN2012100684524A 2012-03-15 2012-03-15 一种程序结构插件化方法及系统 Pending CN102662656A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2012100684524A CN102662656A (zh) 2012-03-15 2012-03-15 一种程序结构插件化方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2012100684524A CN102662656A (zh) 2012-03-15 2012-03-15 一种程序结构插件化方法及系统

Publications (1)

Publication Number Publication Date
CN102662656A true CN102662656A (zh) 2012-09-12

Family

ID=46772157

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2012100684524A Pending CN102662656A (zh) 2012-03-15 2012-03-15 一种程序结构插件化方法及系统

Country Status (1)

Country Link
CN (1) CN102662656A (zh)

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102982140A (zh) * 2012-11-19 2013-03-20 北京思特奇信息技术股份有限公司 一种基于可扩展标记语言的转换流程定义方法及装置
CN105893013A (zh) * 2015-12-07 2016-08-24 乐视云计算有限公司 工程构建系统及其构建方法
CN106557307A (zh) * 2015-09-29 2017-04-05 腾讯科技(深圳)有限公司 业务数据的处理方法及处理系统
CN108089904A (zh) * 2017-12-21 2018-05-29 上海新案数字科技有限公司 一种展示页面扩展方法及设备
CN108614694A (zh) * 2016-12-30 2018-10-02 武汉斗鱼网络科技有限公司 一种优化代码的方法和装置
CN108804089A (zh) * 2018-05-03 2018-11-13 福建天泉教育科技有限公司 可拼装模块的应用业务能力插件化方法及其系统
CN108958832A (zh) * 2018-06-12 2018-12-07 北京蜂盒科技有限公司 定制业务流程的方法、装置和存储介质以及电子设备
KR20200040456A (ko) * 2018-10-10 2020-04-20 주식회사 위컴즈 스프링(Spring)을 기반으로 한 애플리케이션에 플러그인을 제공하는 방법 및 장치
CN112700555A (zh) * 2020-12-31 2021-04-23 珠海派诺科技股份有限公司 高可配组态化3d数据可视化实现方法、电子设备、存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1972296A (zh) * 2006-12-05 2007-05-30 北京邮电大学 基于xpl的综合多种通信手段的业务生成方法及其系统
CN101533491A (zh) * 2009-04-14 2009-09-16 河北全通通信有限公司 自由流转流程的实现方法
CN101651716A (zh) * 2009-09-14 2010-02-17 杭州世导科技有限公司 业务流处理系统及其处理方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1972296A (zh) * 2006-12-05 2007-05-30 北京邮电大学 基于xpl的综合多种通信手段的业务生成方法及其系统
CN101533491A (zh) * 2009-04-14 2009-09-16 河北全通通信有限公司 自由流转流程的实现方法
CN101651716A (zh) * 2009-09-14 2010-02-17 杭州世导科技有限公司 业务流处理系统及其处理方法

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102982140A (zh) * 2012-11-19 2013-03-20 北京思特奇信息技术股份有限公司 一种基于可扩展标记语言的转换流程定义方法及装置
CN106557307B (zh) * 2015-09-29 2021-06-11 腾讯科技(深圳)有限公司 业务数据的处理方法及处理系统
CN106557307A (zh) * 2015-09-29 2017-04-05 腾讯科技(深圳)有限公司 业务数据的处理方法及处理系统
CN105893013A (zh) * 2015-12-07 2016-08-24 乐视云计算有限公司 工程构建系统及其构建方法
CN108614694A (zh) * 2016-12-30 2018-10-02 武汉斗鱼网络科技有限公司 一种优化代码的方法和装置
CN108089904A (zh) * 2017-12-21 2018-05-29 上海新案数字科技有限公司 一种展示页面扩展方法及设备
CN108089904B (zh) * 2017-12-21 2021-11-16 上海七十迈数字科技有限公司 一种展示页面扩展方法及设备
CN108804089A (zh) * 2018-05-03 2018-11-13 福建天泉教育科技有限公司 可拼装模块的应用业务能力插件化方法及其系统
CN108958832A (zh) * 2018-06-12 2018-12-07 北京蜂盒科技有限公司 定制业务流程的方法、装置和存储介质以及电子设备
KR102191453B1 (ko) 2018-10-10 2020-12-15 (주)에이케이컴즈랩 스프링(Spring)을 기반으로 한 애플리케이션에 플러그인을 제공하는 방법 및 장치
KR20200040456A (ko) * 2018-10-10 2020-04-20 주식회사 위컴즈 스프링(Spring)을 기반으로 한 애플리케이션에 플러그인을 제공하는 방법 및 장치
CN112700555A (zh) * 2020-12-31 2021-04-23 珠海派诺科技股份有限公司 高可配组态化3d数据可视化实现方法、电子设备、存储介质
CN112700555B (zh) * 2020-12-31 2023-11-14 珠海派诺科技股份有限公司 高可配组态化3d数据可视化实现方法、电子设备、存储介质

Similar Documents

Publication Publication Date Title
CN102662656A (zh) 一种程序结构插件化方法及系统
CN112585919B (zh) 利用基于云的应用管理技术来管理应用配置状态的方法
CN106250782B (zh) 一种基于sql语句解析的数据权限控制方法及装置
CN105094818B (zh) 基于soa的自然资源综合应用构建方法及系统
CN101946258B (zh) 基于计算机的业务过程在专用硬件上的基于模型的部署
Guo et al. Combination of cloud manufacturing and 3D printing: research progress and prospect
US20190303512A1 (en) Digital design tools for building construction
CN102375734B (zh) 应用产品开发系统、方法、装置和运行系统、方法、装置
CN103617066A (zh) 一种工作流引擎及其实现方法
CN101946260A (zh) 对基于计算机的业务过程进行建模以用于定制和递送
CN101946257A (zh) 建模基于计算机的业务过程以及模拟操作
CN106233252A (zh) 用于定制软件的动态更新安装器
CN101710361A (zh) 基于面向服务架构的分布式交通仿真平台及其仿真方法
CN105893055B (zh) 流程引擎平台化触发方法
CN104391701A (zh) 一种能效评估软件开发方法
CN101446899A (zh) 一种基于本体的上下文感知应用平台框架模型
CN111104103A (zh) 一种软件编辑微服务的可视化方法及系统
García et al. Midgar: Creation of a graphic domain-specific language to generate smart objects for Internet of Things scenarios using model-driven engineering
CN102253974A (zh) 一种地理模型网络服务的动态组合方法
CN109981792A (zh) 一种基于云平台的业务处理方法和装置
CN202210812U (zh) 基于云平台的数据终端接入系统
Rahman et al. Tarsier and ICMS: two approaches to framework development
Abdelrahman et al. A three-tier architecture visual-programming platform for building-lifecycle data management
CN103714208A (zh) 场景驱动cps系统的结构模型与行为模型协同建模方法
CN109597611A (zh) 前端数据流控制组件开发系统、方法、设备及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C53 Correction of patent of invention or patent application
CB02 Change of applicant information

Address after: 100085 Haidian District, Zhongguancun, South Street, No. 6,, building information, floor, No. 16

Applicant after: SI-TECH Information Technology Ltd.

Address before: 100085 Haidian District, Zhongguancun, South Street, No. 6,, building information, floor, No. 16

Applicant before: Beijing Digital China SI-TECH Information Technology Co., Ltd.

COR Change of bibliographic data

Free format text: CORRECT: APPLICANT; FROM: BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY LTD. TO: BEIJING SI-TECH INFORMATION TECHNOLOGY LTD.

C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20120912