在财务月结,HR薪资核算等系统用户集中使用高峰时期。通过判断判断当前系统可用的并行对话框进程数,用户使用过多给出提示,服务器进程预警通知。
1. 根据配置的进程最大可使用率80%,根据进程数判断:当进程可用数少于20%,提示报错【初始化服务器组时,或系统进程高负载】
2. 根据配置的服务器响应时间(ms),获取服务器列表最新数据 ,超出最大响应时间,给出报警提示用户 系统响应慢 ,请稍后再试。
3. 根据CPU判断:如当CPU超出80%,提示 报错
FUNCTION zhrfm_judge_work_process.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(GROUP_NAME) TYPE RZLLITAB-CLASSNAME DEFAULT SPACE
*" EXPORTING
*" VALUE(ES_MESG) TYPE ZSHR_MESSAGE
*" REFERENCE(IDLE_CPU) TYPE ALPNEWVALS
*"----------------------------------------------------------------------
DATA: ls_pm01 TYPE zthr_pm01.
SELECT SINGLE * FROM zthr_pm01 INTO ls_pm01.
**************************************************************************************
* 一、根据进程数判断:当进程可用数少于20%,提示报错
**************************************************************************************
DATA: lv_max TYPE i,
lv_free TYPE i,
lv_percent TYPE p DECIMALS 2.
IF ls_pm01-proc_switch = 'X'.
CALL FUNCTION 'SPBT_INITIALIZE'
EXPORTING
group_name = ' '
IMPORTING
max_pbt_wps = lv_max
free_pbt_wps = lv_free
EXCEPTIONS
invalid_group_name = 1
internal_error = 2
pbt_env_already_initialized = 3
currently_no_resources_avail = 4
no_pbt_resources_found = 5
cant_init_different_pbt_groups = 6
OTHERS = 7.
IF sy-subrc = 4.
es_mesg-msgty = 'E'.
es_mesg-msgtx = '当前查询人员过多,初始化服务器组时出现错误,请稍后再试!'.
RETURN.
ENDIF.
IF lv_max NE 0.
lv_percent = ( lv_free / lv_max ) * 100.
IF lv_percent LT ( 100 - ls_pm01-proc_num ).
es_mesg-msgty = 'E'.
es_mesg-msgtx = '当前查询人员过多,系统进程高负载,请稍后再试!'.
RETURN.
ENDIF.
ENDIF.
ENDIF.
**************************************************************************************
* 一、根据进程数判断:当进程可用数少于20%,提示报错
**************************************************************************************
DATA intg_tbl TYPE TABLE OF salstintg WITH HEADER LINE.
DATA intg_tbl_pi TYPE TABLE OF salstintg WITH HEADER LINE.
DATA:intg_tbl_mail TYPE TABLE OF salstintg WITH HEADER LINE.
DATA :g_max_time TYPE int4, "报警响应时间
lv_sum_time TYPE int4.
CLEAR intg_tbl_mail[].
IF ls_pm01-response_switch = 'X'.
g_max_time = ls_pm01-response_time."报警响应时间
"获取服务器列表
CALL FUNCTION 'RZL_STRG_READALL_I'
EXPORTING
srvname = 'MSGSERVER'
TABLES
intg_tbl = intg_tbl
EXCEPTIONS
OTHERS = 01.
"刷新每个服务器数据
LOOP AT intg_tbl WHERE value1 = 7353.
CALL FUNCTION 'RZL_STRG_DEL'
EXPORTING
srvname = intg_tbl-name
name = 'FAV_COMPUTE_LGIN'
typ = 'C'
EXCEPTIONS
OTHERS = 01.
CALL FUNCTION 'RZL_SUBMIT'
DESTINATION intg_tbl-name
EXPORTING
repid = 'RSRZLLG0'
EXCEPTIONS
OTHERS = 01.
ENDLOOP.
"重新获取最新的数据
CLEAR intg_tbl[].
CALL FUNCTION 'RZL_STRG_READALL_I'
EXPORTING
srvname = 'MSGSERVER'
TABLES
intg_tbl = intg_tbl
EXCEPTIONS
OTHERS = 01.
DATA lv_num TYPE i.
CLEAR lv_num.
LOOP AT intg_tbl WHERE value1 = 7353. " AND VALUE5 = 3537. "Yue
lv_sum_time = lv_sum_time + intg_tbl-value2.
IF intg_tbl-value2 GE '1000'.
lv_num = lv_num + 1.
ENDIF.
ENDLOOP.
IF lv_sum_time > g_max_time.
es_mesg-msgty = 'E'.
es_mesg-msgtx = '当前查询人员过多,系统响应慢,请稍后再试!'.
RETURN.
ENDIF.
IF lv_num GE '3'.
es_mesg-msgty = 'E'.
es_mesg-msgtx = '当前查询人员过多,系统响应慢,请稍后再试!'.
RETURN.
ENDIF.
ENDIF.
**************************************************************************************
* 三、根据CPU判断:当CPU少于50%、80%,提示 报错
**************************************************************************************
* DATA: lv_max TYPE i,
* lv_free TYPE i,
* lv_percent TYPE p DECIMALS 2.
IF ls_pm01-proc_switch = 'X'.
* CALL FUNCTION 'GET_CPU_ALL'.
DATA lt_ccm_data TYPE TABLE OF ccm_data.
DATA ls_ccm_data TYPE ccm_data.
DATA lv_dest_logical TYPE rfcdes-rfcdest.
CONCATENATE sy-host '_' sy-sysid '_00'INTO lv_dest_logical. "ehr01-m-szzb SY-PAUTH
* lv_dest_logical = sy-title+4(19).
CALL FUNCTION 'GET_CCM_DATA'
EXPORTING
* LOCAL_REMOTE = 'LOCAL'
logical_destination = lv_dest_logical " ehr01-m-szzb_RP1_00
* IMPORTING
* F_CCM_DATA_READ =
* ACTIVEFLAG =
* INTERVAL =
* DETAILSCOLL =
* DETAILSREQI =
* DETAILSMODE =
* LASTCOLLWRT =
* LASTCOLLINT =
* NORMCOLLINT =
TABLES
tf_ccm_data = lt_ccm_data
EXCEPTIONS
internal_error_adress_failed = 1
internal_error_different_field = 2
internal_error_no_new_line = 3
collector_not_running = 4
shared_memory_not_available = 5
collector_busy = 6
version_conflict = 7
no_network_collector_running = 8
system_failure = 9
communication_failure = 10
OTHERS = 11.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF lt_ccm_data[] IS NOT INITIAL.
CLEAR ls_ccm_data.
READ TABLE lt_ccm_data INTO ls_ccm_data WITH KEY objectname = 'CPU' attributename = 'Idle' mteclass = 'CPU_Idle'. " CPU_UsageUser
IF sy-subrc = 0.
* DATA lv_idle2(5).
* DATA(lv_idle) = ls_ccm_data-perf_snap_total / ls_ccm_data-perf_snap_number / 10 ** ls_ccm_data-perf_decimals.
* WRITE lv_idle TO lv_idle2 DECIMALS ls_ccm_data-perf_decimals.
idle_cpu = ls_ccm_data-perf_snap_total.
* IF ls_ccm_data-perf_snap_total LE '50'." AND ls_ccm_data-perf_snap_total GT '20' . " Idle CPU
** idle_cpu = 'A'.
* ENDIF.
* IF ls_ccm_data-perf_snap_total LE '20' . " Idle CPU
* idle_cpu = 'B'.
** es_mesg-msgty = 'E'.
** es_mesg-msgtx = '当前操作人员过多,请稍后再试!'.
* ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.