操作上的服务插件、服务端服务 |
您所在的位置:网站首页 › productlineid › 操作上的服务插件、服务端服务 |
最近与同事们讨论了,操作上的服务插件、服务端服务有什么区别?谁先执行? 写篇文章总结一下讨论结果。 服务插件、服务端服务的添加入口,如下图: 服务插件介绍贯穿整个操作的执行流程,操作涉及到事务的提交,在事务的各个阶段都会调用插件的事件进行通知。 使用方式: 继承AbstractOperationServicePlugIn类 常用事件: beforeExecuteOperationTransaction 操作校验通过之后,开启事务之前,触发此事件 beginOperationTransaction 操作校验通过,开启了事务,准备把数据提交到数据库之前触发此事件 endOperationTransaction 数据已经提交到数据库之后,事务未提交之前,触发此事件 rollbackOperation 操作事务提交失败,事务回滚之后触发此事件 afterExecuteOperationTransaction 操作执行完毕,事务提交之后,触发此事件 参考文档: https://developer.kingdee.com/article/225548911073404160?productLineId=29&isKnowledge=2 https://developer.kingdee.com/article/225570386111660544 服务端服务介绍我个人认为,本质上也是一种服务插件,算是苍穹内置的。 服务端服务如下图: 服务端服务在xml文件中注册,这个xml文件是内置在苍穹jar包里面的,包名通常是 bos-ext-xxx(业务云标识).jar 例如: AutoGenerateScmcOrder (“电商订单自动生成供应链采购订单”操作),放在了bos-ext-scm-1.0.jar下面,以及他的注册文件OpBizRule_scm.xml。 可以在源码中看到,他也是从AbstractOperationServicePlugIn层层派生下去的。 来到AutoGenerateScmcOrder的父类,可以看到是在beforeExecuteOperationTransaction中调用setMServiceParam这个抽象方法的,即AutoGenerateScmcOrder的主体的业务逻辑,即 生成供应链采购订单。 谁先被调用?在服务插件、服务端服务是在EntityOperateService中被调用的。 plugInProxy、opBizRuleService两个代理对象分别代理了 服务插件、服务端服务插件的代理类。 虽然调用顺序是服务插件先被调用,但是,在不同的服务端服务上执行主体业务逻辑是不一样的。 例如: 像是“自动下推”操作(实现类AutoPushOpAction),“电商订单自动生成供应链采购订单”操作(实现类AutoGenerateScmcOrder), 他们的执行主体业务逻辑的地方不一样。 上图的“电商订单自动生成供应链采购订单”操作在beforeExecuteOperationTransaction事件中执行。 “自动下推”是在afterExecuteOperationTransaction里面执行主体业务逻辑。 总结1.服务插件、服务端服务都是由AbstractOperationServicePlugIn的派生类实现的。 2.服务插件、服务端服务的执行顺序要结合具体的操作业务逻辑。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |