前言
曾经有幸在科蓝公司做过开发,很多银行项目基于PE框架,由于项目开发较早,想着当时还没有MVC框架,更遑论现今主流的SpringMVC/SpringBoot框架了,老一批的程序员基于JSP/Servlet开发,后期又加入了很多的优化,导致项目看起来特别费劲,又因为软件著作权的原因吧,度娘也看不到什么让人眼前一亮的博文。最近整理电脑,发现还有那么一个MerchantTest项目,心血来潮看了一下,若干年后纯粹想总结一下,希望给仍使用该PE框架的小伙伴一点点火花。
1. PE内部结构
如图所示(看到百度文库有这么个资料,我这里不算是泄露机密吧),PE内部结构重点关注Chain和Template,这是PE框架的精髓:抽象模板+责任链模式;此外值得注意的还有参数Context,封装了交易中用到的各种配置参数、业务参数等(其实,Context是ThreadLocal类型的参数,每个交易过来后new出来的一个Context对象,并把该对象赋值ThreadLocal对象中,伴随其后交易的一生)
2. Servlet起点
自从有了成熟框架后,程序员就很少再写Servlet类了,以前老的项目都是写一个继承HttpServlet的类作为控制器,PE也是如此,PowerEngineDispatcher继承HttpServlet。
如上图所示,web.xml配置了PowerEngineDispatcher作为控制器,serverApplication.xml其实就是相关配置(交易配置,菜单配置,transaction、chain等)
3. DTD文件定义
自从有了XSD文件后,也很少再写DTD文件了,这两种文件都是对XML文件的定义,用于对配置的.xml文件进行解析。
如图所示,截取了一部分transaction的DTD文件定义,其实servlet容器(jetty)启动时,解析.xml文件,最终解析成IOC容器中的对象。
4. PowerEngineDispatcher服务
1.
2.
3.
4.
5.
6.
7.
8.
9.
作为HttpServlet的子类,其实接受到GET/POST请求,最终都是有doService()方法执行,所以看该方法即可,方法调用controller.process()执行逻辑。
其中,controller类主要做了以下几件事:(为防被告泄密,简单描述)
1. 生成Context对象LocalServletContext
2. coreController子类执行execute方法
3. context赋值给ThreadLocal对象
4. 拿到交易类中的chain链,执行链中的doValidation逻辑,其中注意DelegateCommand链(defaultChain默认链),执行到该链时,其实意味着chain链中的各种逻辑(校验、验证)已走完,然后执行template中的action逻辑(action为特性化配置)
5. action根据交易进行个性化配置,比如一些准备工作(action实现Preparable接口),真正业务逻辑前后的切面(preAction,aftAction)
6. 执行action的submit方法
7. 执行action的execute方法
8. 调用Transport的submit方法(Transport有很多子类,可以认为发往哪儿,是什么类型的,比如OnlineTcpTransport就是发往pp-online的TCP交易(联机交易)
9. 调用Transport子类的submit方法(IO输入输出流,基于Socket编程,发送交易至下游pp-online应用)
5. pp-online联机交易
pp-online应用是application类型的应用
总结
1. PE框架因出现的时期较早,所以看不到现在成熟框架的影子
2. PE框架的研究,虽然代码难懂,但是很有意义(如DTD、Servlet)
3. PE框架基于模板和责任链模式,业务代码隔离至action中,开发人员只要写这部分代码,加上一些模板的选择和责任链的个性化拼接即可
4. PE框架的模板或责任链如果不适用当前系统,可以进行组合或者扩展(一直没用过)
5. 对于模板和责任链模式的研究,可以让你深刻理解接口规范,抽象类模板的概念
代码比较难懂,看了好久才有如上总结,这里记录总结下,对自己有个交代,也希望对你有用。