retry_limit_exceeded

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.