最近遇到一次系统卡顿,经检查原因是一个每五分钟执行一次的JOB并发执行导致的。
思考通过记录程序执行时间,定期关闭程序的方法解决问题,由于程序未执行结束的原因是因为接口阻塞导致的,所以无法在SAP端获取执行时间,故无法解决问题。
后来思考通过 JOB程序内包装触发另一个JOB的方式解决,在触发JOB前检查之前JOB执行的状态,如果是正在执行的状态则调用JOB_CLOSE关闭前一个JOB执行新的JOB保证不会并发执行造成卡滞。
最后经同事提醒找到资料系统表TBTCP / TBTCO会记录JOB执行状态,调用函数:
GET_JOB_RUNTIME_INFO 获取当前执行的JOB名称&JOB编号,
通过取表数据判断是否存在并行JOB就可以解决问题了。
分包检查函数代码如下,考虑以后在可能发生并发情况的JOB程序前调用此检查,欢迎指正:
FUNCTION zjob_check.
*"----------------------------------------------------------------------
*"*"本地接口:
*" EXPORTING
*" REFERENCE(EX_FLG) TYPE CHAR1
*" REFERENCE(EX_MESSAGE) TYPE CHAR255
*"----------------------------------------------------------------------
----------------------检查JOB并发执行------------------------------------
DATA: lv_jobname TYPE tbtcm-jobname,
lv_jobcount TYPE tbtcm-jobcount.
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
IMPORTING
jobname = lv_jobname
jobcount = lv_jobcount
EXCEPTIONS
no_runtime_info = 1
OTHERS = 2.
IF sy-subrc <> 0.
ELSE.
SELECT SINGLE * FROM tbtco INTO @DATA(ls_tbtco)
WHERE jobname = @lv_jobname AND status EQ 'R'
AND sdlstrtdt = @sy-datum AND jobcount NE @lv_jobcount.
IF sy-subrc = 0.
ex_flg = 'X'.
ex_message = ls_tbtco-sdlstrttm && '开始执行的同名JOB尚未执行完毕,本次执行取消!'.
ENDIF.
ENDIF.
ENDFUNCTION.