SAP/ABAP

Proxy Error : Message.General

Denise 2022. 8. 3. 13:49

When proxy error occurs, soap fault message always returns "MESSAGE.GENERAL"

you can get the detail message from XI server.

 

 

*--- Call Method
        CALL METHOD lo_proxy->(ls_header-obj_name1)
          PARAMETER-TABLE
            lt_params[]
          EXCEPTION-TABLE
            lt_except[].

        COMMIT WORK.
        IF iv_async IS NOT INITIAL.
          CALL FUNCTION 'ZDK_GET_PROXY_ASYNC_ACK'
            EXPORTING
              io_proxy   lo_proxy
            IMPORTING
              ev_status  ev_status
              ev_message ev_message.
        ENDIF.

 

FUNCTION zdk_get_proxy_async_ack.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IO_PROXY) TYPE REF TO  CL_PROXY_CLIENT
*"  EXPORTING
*"     REFERENCE(EV_STATUS)
*"     REFERENCE(EV_MESSAGE) TYPE  CSEQUENCE
*"----------------------------------------------------------------------
  CONSTANTSlc_wait_max     TYPE VALUE 600.
  CONSTANTSlc_error_max    TYPE VALUE 300.
  CONSTANTSlc_code_notyet  TYPE sxmserrid
                VALUE cx_xms_syserr_proxy=>co_id_no_ack_arrived_yet.

  DATAlv_count      TYPE i.
  DATAlv_pattern    TYPE string.

  DATAlo_ack        TYPE REF TO if_ws_acknowledgment.
  DATAlo_message    TYPE REF TO if_wsprotocol_message_id.
  DATAls_status     TYPE prx_ack_status.
  DATAlv_msgid      TYPE sxmsmguid.

  DATAlt_ack_detail TYPE prx_ack_status_detail_table.
  DATAls_ack_detail LIKE LINE OF lt_ack_detail.
  DATAlt_ack_table  TYPE prx_ack_status_table.
  DATAls_ack_table  LIKE LINE OF lt_ack_table.
  DATAls_app_fault  TYPE prx_ack_app_fault.

  DATAcx_system     TYPE REF TO cx_ai_system_fault.

  TRY.
      lo_message ?= io_proxy->get_protocolif_wsprotocol=>message_id ).
    CATCH cx_ai_system_fault.
      ev_status  gc_failure.
      ev_message 'get message protocol failed'.
      EXIT.
  ENDTRY.

  IF sy-subrc IS INITIAL.

    lv_msgid  lo_message->get_message_id).

    DO.

      TRY.
          lo_ack    cl_proxy_access=>get_acknowledgmentlv_msgid ).
          ls_status lo_ack->get_status).

          IF sy-subrc IS INITIAL
            AND ls_status-is_final 'X'.
            ev_status gc_success.
            EXIT.
          ELSE.
            CASE ls_status-ack_status.
              WHEN if_xms_persist_const=>co_stat_ack_app_error_trans  " 73
                OR if_xms_persist_const=>co_stat_ack_app_error_final  " 83
                OR if_xms_persist_const=>co_stat_ack_sys_error_trans  " 75
                OR if_xms_persist_const=>co_stat_ack_sys_error_final  " 85
                OR if_xms_persist_const=>co_stat_ack_not_supported    " 88
                OR if_xms_persist_const=>co_stat_ack_cancel.          " 90

                CALL METHOD lo_ack->get_status_detail
                  IMPORTING
                    ack_status_detail_table lt_ack_detail.

                IF lt_ack_detail IS NOT INITIAL.
                  READ TABLE lt_ack_detail INTO ls_ack_detail INDEX 1.
                  IF ls_ack_detail-ack_data IS NOT INITIAL.
                    READ TABLE ls_ack_detail-ack_data INTO ls_ack_table INDEX 1.
                    ls_app_fault ls_ack_table-faultdata.
*                    lv_pattern = ': *([^:]+): *[^:]+: *[^:]+: *[^:]+$'.
                    lv_pattern ': *[^:]+: *[^:]+: *([^:]+: *[^:]+)$'"Oracle error
                    FIND REGEX lv_pattern IN ls_app_fault-fault_text
                                          SUBMATCHES ev_message.
                    IF sy-subrc IS NOT INITIAL.
                      ev_message ls_app_fault-fault_text.
                    ENDIF.
                  ENDIF.
                ENDIF.

              WHEN if_xms_persist_const=>co_stat_ack_not_yet"071
                WAIT UP TO SECONDS.
                lv_count lv_count + 1.
                IF lv_count lc_wait_max.
                  ev_message 'MESSAGE not yet Received ( 10 Min. )'.
                ENDIF.
              WHEN OTHERS.
                "?
            ENDCASE.

            IF ev_message IS NOT INITIAL.
              ev_status gc_failure.
              EXIT.
            ENDIF.
          ENDIF.

        CATCH cx_ai_system_fault INTO cx_system.
          IF cx_system->code lc_code_notyet.
            sy-subrc 1.

            WAIT UP TO SECONDS.
            lv_count lv_count + 1.
            IF lv_count lc_error_max.
              ev_status gc_failure.
              ev_message 'Exceeded waiting limit ( 5 min ).'.
              EXIT.
            ENDIF.
            CONTINUE.
          ELSE.
            ev_status gc_failure.
            EXIT.
          ENDIF.

      ENDTRY.
    ENDDO.
  ELSE.
    ev_status  gc_failure.
    ev_message 'failed'.
  ENDIF.

ENDFUNCTION.

'SAP > ABAP' 카테고리의 다른 글

ALV shows 99 columns only  (0) 2023.10.23
Routing maintenance  (0) 2022.11.17
Hana Error: cannot use duplicate index name  (0) 2022.08.03
ENQUEUE_READ  (0) 2022.06.24
SQL Editor for Hana ( Native )  (0) 2022.06.09