in src/zrest/zcl_rest_utility_class.clas.abap [0:0]
METHOD retry_limit_exceeded.
DATA:it_data TYPE TABLE OF zrest_monitor,
it_retrynum TYPE TABLE OF zrest_conf_misc,
wa_data TYPE zrest_monitor,
wa_retrynum TYPE zrest_conf_misc,
lt_lines TYPE TABLE OF tline,
lw_lines TYPE tline,
lt_body TYPE soli_tab,
lt_body_email TYPE soli_tab,
lt_body_tmp TYPE soli_tab,
lw_body_tmp TYPE soli,
lv_subject TYPE so_obj_des,
lv_recepient TYPE adr6-smtp_addr,
lt_zrt_monitor TYPE zrt_monitor,
lt_zrt_monitor_tmp TYPE zrt_monitor,
lt_monitor_final TYPE zrt_monitor,
lw_monitor_final TYPE zrest_monitor,
lw_return TYPE bapiret2,
lv_result TYPE os_boolean,
lt_retry_report TYPE TABLE OF zrest_retry_limi,
lw_retry_report TYPE zrest_retry_limi,
lv_messageid TYPE char50,
lv_tabix TYPE sytabix.
TYPES: BEGIN OF lty_email_data,
email_id TYPE ad_smtpadr,
mail_body_txt TYPE tdobname,
max_retry TYPE zq_counte,
retry_method TYPE zretry_method.
INCLUDE TYPE zrest_monitor.
TYPES: END OF lty_email_data.
DATA: lw_email_data TYPE lty_email_data,
lt_email_data TYPE TABLE OF lty_email_data.
FIELD-SYMBOLS: <lfs_zrt_monitor> TYPE zrest_monitor,
<lfs_body> TYPE soli,
<lfs_retry_report> TYPE zrest_retry_limi.
CONSTANTS: lc_object TYPE balobj_d VALUE 'Z_REST_LOG',
lc_object_sub TYPE balsubobj VALUE 'Z_REST_SUB'.
DATA: lt_alog TYPE zrt_applog_message,
lw_alog TYPE zrest_applog_message,
lv_extnum TYPE balnrext,
lv_jobcnt TYPE tbtcm-jobcount,
lv_jobnme TYPE tbtcm-jobname.
CLEAR: lv_messageid, lt_alog, lv_extnum,
lv_jobcnt, lv_jobnme, lw_alog.
CLEAR: lt_retry_report.
SELECT * FROM zrest_monitor
INTO TABLE it_data
WHERE rertynum > 0
AND ( httpstatus <= 200 OR httpstatus >= 300 )
AND mail_sent = ' '.
*
IF it_data IS NOT INITIAL.
SELECT * FROM zrest_conf_misc
INTO TABLE it_retrynum
FOR ALL ENTRIES IN it_data
WHERE interface_id = it_data-interface_id.
IF sy-subrc = 0.
SORT it_retrynum BY interface_id method.
LOOP AT it_data INTO wa_data.
READ TABLE it_retrynum INTO wa_retrynum WITH KEY interface_id = wa_data-interface_id
method = wa_data-method BINARY SEARCH.
IF sy-subrc EQ 0.
IF wa_retrynum-max_retry <= wa_data-rertynum.
APPEND wa_data TO lt_zrt_monitor.
*// Join 2 tables for sending Email
MOVE-CORRESPONDING wa_data TO lw_email_data.
lw_email_data-max_retry = wa_retrynum-max_retry.
lw_email_data-email_id = wa_retrynum-email_id.
lw_email_data-mail_body_txt = wa_retrynum-mail_body_txt.
lw_email_data-retry_method = wa_retrynum-retry_method.
APPEND lw_email_data TO lt_email_data.
CLEAR wa_data.
ENDIF.
*// Config Table is not maintained
ELSE.
lw_retry_report-zmessageid = wa_data-zmessageid.
lw_retry_report-zuser = wa_data-zuser.
lw_retry_report-zexedate = wa_data-zexedate.
lw_retry_report-zexetime = wa_data-zexetime.
lw_retry_report-destination = wa_data-destination.
lw_retry_report-interface_id = wa_data-interface_id.
lw_retry_report-method = wa_data-method.
lw_retry_report-message = 'Config Table is not maintained'(008).
APPEND lw_retry_report TO et_retry_report.
ENDIF.
ENDLOOP.
ELSE.
MESSAGE 'No Data Found in Config Table'(010) TYPE 'I'.
RETURN.
ENDIF.
SORT lt_zrt_monitor BY zmessageid.
*// Get standard Text for the Email Subject from SO10
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'ST'
language = sy-langu
name = 'ZREST_RETRY_EMAIL_BODY'
object = 'TEXT'
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
MESSAGE 'Mail Body is not maintained'(008) TYPE 'I'.
RETURN.
ELSE.
LOOP AT lt_lines INTO lw_lines.
APPEND lw_lines-tdline TO lt_body.
ENDLOOP.
ENDIF.
lv_subject = 'HTTP Calls: Maximum Retry has been reached'.
*// Sort based on Email and Consolidate all the failures in a single email
SORT lt_email_data BY email_id interface_id.
LOOP AT lt_email_data INTO lw_email_data.
*// Prepare the header of the email.
AT NEW email_id.
*// Find the standard Text from the Configuration Table when maintained
IF lw_email_data-mail_body_txt IS NOT INITIAL.
CLEAR: lt_body_email.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'ST'
language = sy-langu
name = lw_email_data-mail_body_txt
object = 'TEXT'
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
LOOP AT lt_lines INTO lw_lines.
APPEND lw_lines-tdline TO lt_body_email.
ENDLOOP.
ENDIF.
ENDIF.
*// Prepare Tabular Display of Interface and messages.
*// Set Email Body Table header border and Color
lw_body_tmp-line = '<head>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<style type="text/css">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<!--'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'table{background-color:#FFF;border-collapse:collapse;}'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'td.Data{background-'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'color:#FFF;border:1px solid black;padding:3px;}'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'td.Heading{background-color:Blue;text-'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'align:center;border:1px solidblack;padding:3px;}'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '-->'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</style>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<head>'.
APPEND lw_body_tmp TO lt_body_tmp.
*// Prepare Table Header Data
lw_body_tmp-line = '<TABLE class="Data">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<tr>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Heading">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'Interface Id:'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Heading">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'Message Id:'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Heading">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'Method:'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Heading">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = 'Retry Number'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</tr>'.
APPEND lw_body_tmp TO lt_body_tmp.
ENDAT.
*// Prepare Data Records of the table
lw_body_tmp-line = '/tr>'.
lw_body_tmp-line = '<td class="Data">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = lw_email_data-interface_id.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Data">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = lw_email_data-zmessageid.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Data">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = lw_email_data-method.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '<td class="Data">'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = lw_email_data-max_retry.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</td>'.
APPEND lw_body_tmp TO lt_body_tmp.
lw_body_tmp-line = '</tr>'.
APPEND lw_body_tmp TO lt_body_tmp.
READ TABLE lt_zrt_monitor ASSIGNING <lfs_zrt_monitor>
WITH KEY zmessageid = lw_email_data-zmessageid
BINARY SEARCH.
IF sy-subrc = 0.
<lfs_zrt_monitor>-mail_sent = 'X'.
APPEND <lfs_zrt_monitor> TO lt_zrt_monitor_tmp.
ENDIF.
*// Prepare Success Log Template
lw_retry_report-zmessageid = lw_email_data-zmessageid.
lw_retry_report-zuser = lw_email_data-zuser.
lw_retry_report-zexedate = lw_email_data-zexedate.
lw_retry_report-zexetime = lw_email_data-zexetime.
lw_retry_report-destination = lw_email_data-destination.
lw_retry_report-interface_id = lw_email_data-interface_id.
lw_retry_report-method = lw_email_data-method.
lw_retry_report-max_retry = lw_email_data-max_retry.
lw_retry_report-message = 'Success. Email Sent'(004).
APPEND lw_retry_report TO lt_retry_report.
AT END OF email_id.
*// Close the table of Email Body
lw_body_tmp-line = '</TABLE>'.
APPEND lw_body_tmp TO lt_body_tmp.
*// Use the SO10 Template and insert extra lines for Mail Body
IF lt_body_email IS INITIAL.
*// Refer standard template only if Config table is not maintained with TEXT Name
lt_body_email = lt_body.
ENDIF.
READ TABLE lt_body_email ASSIGNING <lfs_body> WITH KEY line = '&LW_INTERFACE&'.
IF sy-subrc = 0.
lv_tabix = sy-tabix.
INSERT LINES OF lt_body_tmp INTO lt_body_email INDEX lv_tabix.
DELETE lt_body_email WHERE line = '&LW_INTERFACE&'.
ENDIF.
lv_recepient = lw_email_data-email_id.
*// Call the email send Method
send_email(
EXPORTING
iv_recepient = lv_recepient
iv_subject = lv_subject
it_body = lt_body_email
IMPORTING
ew_return = lw_return
ev_result = lv_result ).
IF lv_result IS NOT INITIAL.
*// Collect to final table to Update Email Sent Flag.
APPEND LINES OF lt_zrt_monitor_tmp TO lt_monitor_final.
APPEND LINES OF lt_retry_report TO et_retry_report.
*// Update Success Log
ELSEIF lw_return IS NOT INITIAL.
*// Send Mail returned Error
CONCATENATE lw_return-type lw_return-id lw_return-number lw_return-message_v1
INTO lw_retry_report-message SEPARATED BY space.
*// Update Error Message
LOOP AT lt_retry_report ASSIGNING <lfs_retry_report>.
<lfs_retry_report>-message = lw_retry_report-message.
ENDLOOP.
APPEND LINES OF lt_retry_report TO et_retry_report.
*// No Exception is returned from Send Mail
ELSE.
LOOP AT lt_retry_report ASSIGNING <lfs_retry_report>.
<lfs_retry_report>-message = 'Error. Email Not Sent'(005).
ENDLOOP.
APPEND LINES OF lt_retry_report TO et_retry_report.
ENDIF.
*// Clear attributes for Next Iteration
CLEAR: lt_zrt_monitor_tmp, lt_retry_report, lt_body_email, lv_recepient, lw_retry_report,
lt_body_tmp.
ENDAT.
ENDLOOP.
*// Update the table to mark Email sent
DELETE lt_monitor_final WHERE mail_sent IS INITIAL.
*// Set Table Lock
LOOP AT lt_monitor_final INTO lw_monitor_final.
CALL FUNCTION 'ENQUEUE_EZ_ZREST_MONITOR'
EXPORTING
mandt = sy-mandt
zmessageid = lw_monitor_final-zmessageid
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
DELETE lt_monitor_final WHERE zmessageid = lw_monitor_final-zmessageid.
*// If locking failed write to Application log and do not proceed
IF sy-batch IS NOT INITIAL.
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
IMPORTING
jobcount = lv_jobcnt
jobname = lv_jobnme
EXCEPTIONS
no_runtime_info = 1
OTHERS = 2.
IF sy-subrc = 0.
CONCATENATE lv_jobcnt lv_jobnme INTO lv_extnum SEPARATED BY '_'.
ENDIF.
ELSE.
lv_extnum = sy-cprog.
ENDIF.
lv_messageid = 'Table not updated due to lock'(015).
lw_alog-zmsgty = 'E'.
lw_alog-zmsgv1 = lv_messageid.
lw_alog-zmsgv2 = lw_monitor_final-zmessageid.
lw_alog-zmsgv2 = 'ZREST_MONITOR'.
APPEND lw_alog TO lt_alog.
*// Call the application Log
CALL METHOD zcl_rest_utility_class=>write_application_log
EXPORTING
iv_object = lc_object
iv_subobject = lc_object_sub
iv_extnumber = lv_extnum
it_message = lt_alog.
ENDIF.
ENDLOOP.
IF lt_monitor_final IS NOT INITIAL.
MODIFY zrest_monitor FROM TABLE lt_monitor_final.
IF sy-subrc = 0.
MESSAGE 'Table ZREST_MONITOR updated Successfully'(011) TYPE 'S'.
ELSE.
MESSAGE 'Table ZREST_MONITOR not updated'(012) TYPE 'I'.
ENDIF.
ENDIF.
ELSE.
MESSAGE 'No Messages Found'(013) TYPE 'I'.
ENDIF.
LOOP AT lt_monitor_final INTO lw_monitor_final.
CALL FUNCTION 'DEQUEUE_EZ_ZREST_MONITOR'
EXPORTING
mandt = sy-mandt
zmessageid = lw_monitor_final-zmessageid.
ENDLOOP.