要对基于one order framework进行性能调优,需要对one order framework的事件处理有一个最基本的了解。
我通过截图列出了一些关键点,你看看根据这些信息能不能自己找到问题的答案:
通过UI创建一个transaction type为TA的sales order为例:
transaction type TA对应的transaction category如下:
Order修改的所有操作都是通过FM CRM_ORDER_MAINTAIN 统一trigger:
最终会调用CRM_ORDER_H_MAINTAIN_OW 或者 CRM_ORDER_I_MAINTAIN_OW处理Header或者Item:
里面的FM CRM_ORDERADM_H_PUBLISH_OW统一raise Order header level的各种事件,从而调用事件上注册的callback。
在该function module内搜索关键字 CRM_EVENT_PUBLISH_OW,能找出该FM 负责raise的所有支持的event:
internal table gt_allowed_callbacks_hdr 存放了当前系统注册的所有call back信息。系统理一次进入CRM_EVENT_PUBLISH_OW时,该内表是空的,通过subroutine register_callbacks 初始化。
当前创建的sales order
gt_pr_assign包含两个从SPRO里维护的category 再加上一个generic的BUS20001:
register完毕后针对transaction type TA,有411个可用的callback:
CRM_EVENT_PUBLISH_OW的执行逻辑就是找出这411个callback中有哪些是注册在Order的header level,且event为after_create:
lv_guid_hdr: 新创建的sales order guid
lt_atonce_exets: 需要立即执行的function module name
真正的function module 执行发生在这里:
To: Wang, Jerry
Subject: 关于回调函数
首先,有几个概念我有点混淆, call back是指回调函数,对吗?也就是在SPRO里, 最下面那个红框EDIT EVENT Handler Table里定义的
CRMV_EVENT is for predefined callbacks. The customer-defined callbacks should not be registered here. Move them to SPRO.
界面如下, 可以看到某个function 比如第3行 ZCRM_CP_PRIN0_ITMCHG_EC被注册到了BUS200001这个general 类型上, immediately执行, event事件是在after_change,即发生改变就触发这个函数,优先度为0,那就是先执行它, 后续可能其他function注册为1,2,3,顺序执行, 执行的触发函数是下面界面的form execute_callbacks_planned; 因为item那项有勾, 只执行ITEM level的也就是item发生改变时执行, header改变的时候不执行,不知道理解的对不对?
但是这个form execute_callbacks_planned的次数, 比如29次是由什么决定的? 还有里面的function, 比如第5行ZER1_YMRP_BTX_QUT_PRODOC_CHK_EC, 被执行了10次, 这是在哪里决定的?
这个调用堆栈, 看来是由CRM_OREDER_MAINTAIN调到的
但是在call stack里也见到了如下form EXECUTE_CALLBACKS_AT_ONCE, 它和上面的区别, 按字面是一个是plan, 一个是立即执行, 但是这是如何区分的? 程序如何知道
看起来也是由Execute_callbacks_planned 最终调用到了EXECUTE_CALLBACKS_AT_ONCE, 但是我不理解 的是那注册在SPRO的那些回调函数到底是由哪个form真正调用的? 或者我的理解是不是已经方向性偏离了?
看以前同事(已经离职, 最近两年走了很多资深同事, 想咨询也很难了)写的关于回调函数的注意点:
Consider the following:
CRMV_EVENT is for predefined callbacks. The customer-defined callbacks should not be registered here. Move them to SPRO.
Restrict the number of times the callback is planned in for a certain execution time to a minimum.
Register the callback for individual transaction categories instead of for the generic transaction category BUS20001 so that the callbacks do not run unnecessarily for other transactions.
Avoid register the unnecessary callbacks to transaction category BUS2000115 -------115 我知道是CRM Sales Transaction, 注册FM在这个上面,是不是也相当于general的调用, 我看联想很多fm都是注册在这里的,
Consider whether it is absolutely necessary to set the execution time “Immediately”. The other execution times are better for performance since several events might trigger the same callback.-----如果不设置成immediately,
还有很多选项, 这个完全得看业务需要和实际逻辑了。
Consider carefully which value you set for the parameter Call Callback and restrict the number of times the callback is planned in for a certain execution time to a minimum. ------这个是在哪里设置????是我第一个界面吗?如何限制调用次数?
要获取更多Jerry的原创文章,请关注公众号"汪子熙":