操作上的服务插件、服务端服务原创
金蝶云社区-吴锐雄
吴锐雄
17人赞赏了该文章 3,573次浏览 未经作者许可,禁止转载编辑于2022年11月29日 16:50:16
summary-icon摘要由AI智能服务提供

本文讨论了服务插件与服务端服务的区别、执行顺序及添加方式。服务插件贯穿操作执行流程,通过继承AbstractOperationServicePlugIn类实现,在事务各阶段触发事件。服务端服务本质上也是服务插件,通过xml文件注册,并继承自AbstractOperationServicePlugIn。两者在EntityOperateService中被调用,但执行顺序和主体业务逻辑位置因操作而异。


最近与同事们讨论了,操作上的服务插件、服务端服务有什么区别?谁先执行?

写篇文章总结一下讨论结果。


服务插件、服务端服务的添加入口,如下图:

image.png


服务插件介绍

贯穿整个操作的执行流程,操作涉及到事务的提交,在事务的各个阶段都会调用插件的事件进行通知。

使用方式

继承AbstractOperationServicePlugIn类

常用事件

beforeExecuteOperationTransaction

操作校验通过之后,开启事务之前,触发此事件

beginOperationTransaction

操作校验通过,开启了事务,准备把数据提交到数据库之前触发此事件

endOperationTransaction

数据已经提交到数据库之后,事务未提交之前,触发此事件

rollbackOperation

操作事务提交失败,事务回滚之后触发此事件

afterExecuteOperationTransaction

操作执行完毕,事务提交之后,触发此事件


参考文档:

https://developer.kingdee.com/article/225548911073404160?productLineId=29&isKnowledge=2

https://developer.kingdee.com/article/225570386111660544


服务端服务介绍

我个人认为,本质上也是一种服务插件,算是苍穹内置的。

服务端服务如下图:

image.png


服务端服务在xml文件中注册,这个xml文件是内置在苍穹jar包里面的,包名通常是 bos-ext-xxx(业务云标识).jar


例如:

AutoGenerateScmcOrder (“电商订单自动生成供应链采购订单”操作),放在了bos-ext-scm-1.0.jar下面,以及他的注册文件OpBizRule_scm.xml。

image.png

可以在源码中看到,他也是从AbstractOperationServicePlugIn层层派生下去的。

image.png

来到AutoGenerateScmcOrder的父类,可以看到是在beforeExecuteOperationTransaction中调用setMServiceParam这个抽象方法的,即AutoGenerateScmcOrder的主体的业务逻辑,即 生成供应链采购订单。

image.png


谁先被调用?

服务插件、服务端服务是在EntityOperateService中被调用的。

plugInProxy、opBizRuleService两个代理对象分别代理了 服务插件、服务端服务插件的代理类。

image.png


虽然调用顺序是服务插件先被调用,但是,在不同的服务端服务上执行主体业务逻辑是不一样的。

例如:

像是“自动下推”操作(实现类AutoPushOpAction),“电商订单自动生成供应链采购订单”操作(实现类AutoGenerateScmcOrder), 他们的执行主体业务逻辑的地方不一样。

上图的“电商订单自动生成供应链采购订单”操作在beforeExecuteOperationTransaction事件中执行。

“自动下推”是在afterExecuteOperationTransaction里面执行主体业务逻辑

image.png


总结

1.服务插件、服务端服务都是由AbstractOperationServicePlugIn的派生类实现的。

2.服务插件、服务端服务的执行顺序要结合具体的操作业务逻辑。



图标赞 17
17人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!