├── .abapgit.xml ├── LICENSE ├── README.md └── src ├── package.devc.xml ├── zbc_async.msag.xml ├── zbc_async_demo.prog.abap ├── zbc_async_demo.prog.xml ├── zbc_parallel_test.fugr.lzbc_parallel_testtop.abap ├── zbc_parallel_test.fugr.lzbc_parallel_testtop.xml ├── zbc_parallel_test.fugr.saplzbc_parallel_test.abap ├── zbc_parallel_test.fugr.saplzbc_parallel_test.xml ├── zbc_parallel_test.fugr.xml ├── zbc_parallel_test.fugr.zbc_paralell_test.abap ├── zcl_bc_async_controller.clas.abap ├── zcl_bc_async_controller.clas.xml ├── zcl_bc_async_task_base.clas.abap ├── zcl_bc_async_task_base.clas.xml ├── zcx_bc_async_base.clas.abap ├── zcx_bc_async_base.clas.xml ├── zcx_bc_async_rfc_error.clas.abap ├── zcx_bc_async_rfc_error.clas.xml └── zsbt_d7737_server_group.ttyp.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | /.gitignore 10 | /LICENSE 11 | /README.md 12 | /package.json 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mike Sidorochkin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![ABAP 7.40](https://img.shields.io/badge/ABAP-7.40%2B-orange) 2 | # ABAP Simple Async Framework 3 | 4 | Parallel-processing is implemented with a special variant of [asynchonous RFC](https://help.sap.com/viewer/7bfe8cdcfbb040dcb6702dada8c3e2f0/1709%20000/en-US/4d909309eba36e73e10000000a15822b.html). 5 | 6 | ABAP requirements (see also the online documentation for the CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP keyword): 7 | 8 | - The function module that you call must be marked as externally callable. This attribute is specified in the Remote function call supported field in the function module definition (transaction SE37)). 9 | - The called function module may not include a function call to the destination "BACK". 10 | - The calling program should not change to a new internal session after making an asynchronous RFC call. That is, you should not use SUBMIT or CALL TRANSACTION in such a report after using CALL FUNCTION STARTING NEW TASK. 11 | - You cannot use the CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP keyword to start external programs. 12 | 13 | Demo program (with aRFC/pRFC): [ZBC_ASYNC_DEMO](https://github.com/MikeSidorochkin/ABAP-Simple-pRFC-Framework/blob/main/src/zbc_async_demo.prog.abap). 14 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Async Framework 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zbc_async.msag.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZBC_ASYNC 7 | E 8 | pRFC Сообщения 9 | 10 | 11 | 12 | E 13 | ZBC_ASYNC 14 | 000 15 | pRFС module not started 16 | 17 | 18 | E 19 | ZBC_ASYNC 20 | 001 21 | pRFC group not found 22 | 23 | 24 | E 25 | ZBC_ASYNC 26 | 002 27 | pRFC Initialization Error 28 | 29 | 30 | E 31 | ZBC_ASYNC 32 | 003 33 | No resources 34 | 35 | 36 | E 37 | ZBC_ASYNC 38 | 004 39 | Wrong name value 40 | 41 | 42 | E 43 | ZBC_ASYNC 44 | 005 45 | Wrong controller object 46 | 47 | 48 | E 49 | ZBC_ASYNC 50 | 006 51 | RFC Start Problem: 52 | 53 | 54 | E 55 | ZBC_ASYNC 56 | 007 57 | Resource timeout 58 | 59 | 60 | E 61 | ZBC_ASYNC 62 | 008 63 | Number of attempts exceeded 64 | 65 | 66 | 67 | R 68 | 69 | 70 | 71 | R 72 | ZBC_ASYNC 73 | pRFC Сообщения 74 | 75 | 76 | 77 | 78 | R 79 | 000 80 | pRFC модуль не запущен 81 | 82 | 83 | R 84 | 001 85 | pRFC группа не найдена 86 | 87 | 88 | R 89 | 002 90 | Ошибка инициализации pRFC 91 | 92 | 93 | R 94 | 003 95 | Нет свободных ресурсов 96 | 97 | 98 | R 99 | 004 100 | Ошибочное имя группы 101 | 102 | 103 | R 104 | 005 105 | Контроллер не задан 106 | 107 | 108 | R 109 | 006 110 | Ошибка запуска RFC модуля: &1 111 | 112 | 113 | R 114 | 007 115 | Таймаут ожидания ресурса 116 | 117 | 118 | R 119 | 008 120 | Превышено число ожидания ресурсов 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /src/zbc_async_demo.prog.abap: -------------------------------------------------------------------------------- 1 | REPORT zbc_async_demo. 2 | 3 | CLASS lcl_task DEFINITION INHERITING FROM zcl_bc_async_task_base. 4 | PROTECTED SECTION. 5 | METHODS: 6 | start REDEFINITION, 7 | receive REDEFINITION. 8 | ENDCLASS. 9 | 10 | PARAMETERS: 11 | p_s_grp TYPE rzlli_apcl DEFAULT 'parallel_generators' MATCHCODE OBJECT spta_server_group, 12 | p_perc TYPE i DEFAULT 75. 13 | 14 | SELECTION-SCREEN: SKIP. 15 | 16 | PARAMETERS: 17 | p_calls TYPE i DEFAULT 20. 18 | 19 | CLASS lcl_task IMPLEMENTATION. 20 | 21 | METHOD start. 22 | CALL FUNCTION 'ZBC_PARALELL_TEST' 23 | STARTING NEW TASK mv_task_name 24 | DESTINATION IN GROUP mv_server_group 25 | CALLING receive_internal ON END OF TASK 26 | * EXPORTING it_data = lt_demo_data " The demo scenario does not require data transfer 27 | EXCEPTIONS 28 | communication_failure = zcl_bc_async_controller=>gc_rfc_errors-communication_failure MESSAGE ev_message 29 | system_failure = zcl_bc_async_controller=>gc_rfc_errors-system_failure MESSAGE ev_message 30 | resource_failure = zcl_bc_async_controller=>gc_rfc_errors-resource_failure 31 | OTHERS = 4. 32 | ev_subrc = sy-subrc. 33 | ENDMETHOD. 34 | 35 | METHOD receive. 36 | RECEIVE RESULTS FROM FUNCTION 'ZBC_PARALELL_TEST' 37 | EXCEPTIONS 38 | communication_failure = zcl_bc_async_controller=>gc_rfc_errors-communication_failure MESSAGE ev_message 39 | system_failure = zcl_bc_async_controller=>gc_rfc_errors-system_failure MESSAGE ev_message. 40 | 41 | ev_subrc = sy-subrc. 42 | * IMPORTING et_data = lt_demo_data " The demo scenario does not require data transfer 43 | ENDMETHOD. 44 | ENDCLASS. 45 | 46 | START-OF-SELECTION. 47 | DATA(go_timer) = cl_abap_runtime=>create_hr_timer( ). 48 | DATA(gv_start_time) = go_timer->get_runtime( ). 49 | 50 | TRY. 51 | DATA(go_controller) = NEW zcl_bc_async_controller( it_server_groups = VALUE #( ( CONV #( p_s_grp ) ) ) 52 | iv_max_percent = p_perc ). 53 | 54 | DO p_calls TIMES. 55 | go_controller->add_task( NEW lcl_task( io_controller = go_controller 56 | iv_name = |{ sy-index }| ) ). 57 | ENDDO. 58 | 59 | go_controller->start( 'Running asynchronous tasks...'(001) ). 60 | CATCH zcx_bc_async_base INTO DATA(go_exception). 61 | WRITE go_exception->get_text( ). 62 | STOP. 63 | ENDTRY. 64 | 65 | DATA(gt_tasks) = go_controller->get_tasks( ). 66 | 67 | WRITE: / 'Processes started: ', p_calls. 68 | ULINE. 69 | 70 | LOOP AT gt_tasks ASSIGNING FIELD-SYMBOL(). 71 | WRITE: / 'Task name: ', -name(5), 72 | 'RFC Dest: ', -rfcdest, 73 | 'Start time: ', |{ -start_time TIMESTAMP = ENVIRONMENT }|, 74 | 'End time: ' , |{ -end_time TIMESTAMP = ENVIRONMENT }|, 75 | 'Error: ', COND string( WHEN -exception IS BOUND THEN -exception->get_text( ) ELSE `-` ). 76 | ENDLOOP. 77 | 78 | ULINE. 79 | 80 | DATA(gv_time) = VALUE t( ). 81 | gv_time = ( go_timer->get_runtime( ) - gv_start_time ) / 1000000. 82 | 83 | WRITE: /(50) 'Total time:', |{ gv_time TIME = USER }|. 84 | -------------------------------------------------------------------------------- /src/zbc_async_demo.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZBC_ASYNC_DEMO 7 | 1 8 | T 9 | E 10 | X 11 | X 12 | 13 | 14 | 15 | I 16 | 001 17 | Running asynchronous tasks... 18 | 52 19 | 20 | 21 | R 22 | Simple pRFC Demo 23 | 16 24 | 25 | 26 | S 27 | P_CALLS 28 | Number of tasks 29 | 23 30 | 31 | 32 | S 33 | P_PERC 34 | Maximum load percentage 35 | 31 36 | 37 | 38 | S 39 | P_S_GRP 40 | Server group (tr. RZ12) 41 | 31 42 | 43 | 44 | 45 | 46 | R 47 | 48 | 49 | R 50 | Демка по паралелльной обработке 51 | 31 52 | 53 | 54 | S 55 | P_CALLS 56 | Кол-во вызовов 57 | 22 58 | 59 | 60 | S 61 | P_KEEP 62 | Хранить контекст 63 | 24 64 | 65 | 66 | S 67 | P_MAXTS 68 | Макс. проц-в в обработке (шт) 69 | 37 70 | 71 | 72 | S 73 | P_PERC 74 | Макс. % загрузки 75 | 24 76 | 77 | 78 | S 79 | P_S_GRP 80 | Группа серверов 81 | 23 82 | 83 | 84 | S 85 | P_TOUT 86 | Таймаут ожидания рес-в (сек) 87 | 36 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.lzbc_parallel_testtop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL ZBC_PARALLEL_TEST. "MESSAGE-ID .. 2 | 3 | * INCLUDE LZHR_PARALELL_TESTD... " Local class definition 4 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.lzbc_parallel_testtop.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZBC_PARALLEL_TESTTOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.saplzbc_parallel_test.abap: -------------------------------------------------------------------------------- 1 | ******************************************************************* 2 | * System-defined Include-files. * 3 | ******************************************************************* 4 | INCLUDE LZBC_PARALLEL_TESTTOP. " Global Data 5 | INCLUDE LZBC_PARALLEL_TESTUXX. " Function Modules 6 | 7 | ******************************************************************* 8 | * User-defined Include-files (if necessary). * 9 | ******************************************************************* 10 | * INCLUDE LZHR_PARALELL_TESTF... " Subroutines 11 | * INCLUDE LZHR_PARALELL_TESTO... " PBO-Modules 12 | * INCLUDE LZHR_PARALELL_TESTI... " PAI-Modules 13 | * INCLUDE LZHR_PARALELL_TESTE... " Events 14 | * INCLUDE LZHR_PARALELL_TESTP... " Local class implement. 15 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.saplzbc_parallel_test.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | SAPLZBC_PARALLEL_TEST 7 | S 8 | D$ 9 | F 10 | S 11 | R 12 | X 13 | D$S 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | pRFC Demo 6 | 7 | LZBC_PARALLEL_TESTTOP 8 | SAPLZBC_PARALLEL_TEST 9 | 10 | 11 | 12 | ZBC_PARALELL_TEST 13 | R 14 | pRFC Demo module 15 | 16 | 17 | IV_DUMMY 18 | X 19 | CHAR10 20 | 21 | 22 | 23 | 24 | IV_DUMMY 25 | P 26 | Character Field Length = 10 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/zbc_parallel_test.fugr.zbc_paralell_test.abap: -------------------------------------------------------------------------------- 1 | FUNCTION ZBC_PARALELL_TEST. 2 | *"---------------------------------------------------------------------- 3 | *"*"Локальный интерфейс: 4 | *" IMPORTING 5 | *" VALUE(IV_DUMMY) TYPE CHAR10 OPTIONAL 6 | *"---------------------------------------------------------------------- 7 | 8 | DO 88888898 TIMES. 9 | sy-index = sy-index * 2. 10 | ENDDO. 11 | 12 | ENDFUNCTION. 13 | -------------------------------------------------------------------------------- /src/zcl_bc_async_controller.clas.abap: -------------------------------------------------------------------------------- 1 | *----------------------------------------------------------------------* 2 | * CLASS ZCL_BC_ASYNC_CONTROLLER DEFINITION 3 | *----------------------------------------------------------------------* 4 | * 5 | *----------------------------------------------------------------------* 6 | class ZCL_BC_ASYNC_CONTROLLER definition 7 | public 8 | final 9 | create public 10 | 11 | global friends ZCL_BC_ASYNC_TASK_BASE . 12 | 13 | public section. 14 | 15 | types: 16 | BEGIN OF ty_task, 17 | task TYPE REF TO zcl_bc_async_task_base, 18 | name TYPE guid_32, 19 | start_time TYPE timestampl, 20 | end_time TYPE timestampl, 21 | exception TYPE REF TO cx_root, 22 | attempts TYPE i, 23 | rfcdest TYPE rfcdes-rfcdest, 24 | END OF ty_task . 25 | types: 26 | tt_tasks TYPE STANDARD TABLE OF ty_task WITH DEFAULT KEY . 27 | 28 | methods CONSTRUCTOR 29 | importing 30 | !IT_SERVER_GROUPS type STRING_TABLE optional 31 | !IV_TIMEOUT type I default 60 32 | !IV_MAX_WPS type I optional 33 | !IV_MAX_ATTEMPTS type I default 10 34 | !IV_MAX_PERCENT type I default 0 35 | !IV_RESERVED_WPS type I default 0 36 | !IV_MIN_WPS type I optional 37 | !IV_EXCLUDE_SERVERS_WITH_ERRORS type ABAP_BOOL default ABAP_TRUE 38 | raising 39 | ZCX_BC_ASYNC_BASE . 40 | methods ADD_TASK 41 | importing 42 | !IO_TASK type ref to ZCL_BC_ASYNC_TASK_BASE . 43 | methods CLEAR_TASKS . 44 | methods START 45 | importing 46 | !IV_MESSAGE type CSEQUENCE 47 | raising 48 | ZCX_BC_ASYNC_BASE . 49 | methods GET_TASKS 50 | returning 51 | value(RT_TASKS) type TT_TASKS . 52 | methods GET_GROUP 53 | returning 54 | value(RV_GROUP) type RZLLITAB-CLASSNAME . 55 | methods IS_NEED_TO_EXCLUDE_SERVERS 56 | returning 57 | value(RV_EXCLUDE) type ABAP_BOOL . 58 | PROTECTED SECTION. 59 | DATA mt_tasks TYPE tt_tasks . 60 | private section. 61 | 62 | data MV_SERVER_GROUP type RZLLITAB-CLASSNAME . 63 | data MV_RUNNING_TASKS type I . 64 | data MV_FINISHED_TASKS type I . 65 | data MV_TASK_TIMEOUT type I . 66 | data MV_MAX_TASKS type DECFLOAT16 . 67 | data MV_MAX_ATTEMPTS type I . 68 | constants: 69 | BEGIN OF gc_rfc_errors, 70 | communication_failure TYPE sysubrc VALUE 1, 71 | system_failure TYPE sysubrc VALUE 2, 72 | resource_failure TYPE sysubrc VALUE 3, 73 | END OF gc_rfc_errors . 74 | data MV_EXCLUDE_SERVERS_WITH_ERRORS type ABAP_BOOL . 75 | 76 | methods SKIP_TASK 77 | importing 78 | !IV_TIMEOUT type ABAP_BOOL optional 79 | !IV_ATTEMPTS_EXCEEDED type ABAP_BOOL optional 80 | changing 81 | !CS_TASK type TY_TASK . 82 | methods TASK_COMPLETE . 83 | methods GET_NEXT_TASK 84 | returning 85 | value(RS_TASK) type ref to ZCL_BC_ASYNC_CONTROLLER=>TY_TASK . 86 | ENDCLASS. 87 | 88 | 89 | 90 | CLASS ZCL_BC_ASYNC_CONTROLLER IMPLEMENTATION. 91 | 92 | 93 | METHOD add_task. 94 | CHECK io_task IS BOUND. 95 | 96 | APPEND VALUE #( task = io_task 97 | name = io_task->get_name( ) ) TO mt_tasks. 98 | ENDMETHOD. 99 | 100 | 101 | METHOD clear_tasks. 102 | CLEAR mt_tasks. 103 | ENDMETHOD. 104 | 105 | 106 | METHOD constructor. 107 | DATA: lv_free_wps TYPE i, 108 | lt_server_groups TYPE STANDARD TABLE OF rzlli_apcl, 109 | lv_group_index TYPE i. 110 | 111 | mv_max_attempts = iv_max_attempts. 112 | mv_exclude_servers_with_errors = iv_exclude_servers_with_errors. 113 | mv_task_timeout = iv_timeout. 114 | 115 | lt_server_groups = it_server_groups. 116 | IF lt_server_groups IS INITIAL. 117 | APPEND 'parallel_generators' TO lt_server_groups. 118 | ENDIF. 119 | 120 | LOOP AT lt_server_groups ASSIGNING FIELD-SYMBOL(). 121 | lv_group_index = sy-tabix. 122 | 123 | CALL FUNCTION 'SPBT_INITIALIZE' 124 | EXPORTING 125 | group_name = 126 | IMPORTING 127 | free_pbt_wps = lv_free_wps 128 | EXCEPTIONS 129 | invalid_group_name = 1 130 | internal_error = 2 131 | pbt_env_already_initialized = 3 132 | currently_no_resources_avail = 4 133 | no_pbt_resources_found = 5 134 | cant_init_different_pbt_groups = 6 135 | OTHERS = 7. 136 | 137 | CASE sy-subrc. 138 | WHEN 0. 139 | EXIT. 140 | WHEN 1. 141 | RAISE EXCEPTION TYPE zcx_bc_async_base 142 | EXPORTING 143 | textid = zcx_bc_async_base=>group_not_found 144 | mv_group = . 145 | WHEN 3. 146 | CALL FUNCTION 'SPBT_GET_CURR_RESOURCE_INFO' 147 | IMPORTING 148 | free_pbt_wps = lv_free_wps 149 | EXCEPTIONS 150 | OTHERS = 1. 151 | IF sy-subrc <> 0. 152 | RAISE EXCEPTION TYPE zcx_bc_async_base 153 | EXPORTING 154 | textid = zcx_bc_async_base=>initialization_error. 155 | ENDIF. 156 | WHEN 2 OR 6. 157 | RAISE EXCEPTION TYPE zcx_bc_async_base 158 | EXPORTING 159 | textid = zcx_bc_async_base=>initialization_error. 160 | WHEN OTHERS. 161 | IF lv_group_index = lines( lt_server_groups ). 162 | RAISE EXCEPTION TYPE zcx_bc_async_base 163 | EXPORTING 164 | textid = zcx_bc_async_base=>resource_error. 165 | ELSE. 166 | CONTINUE. 167 | ENDIF. 168 | ENDCASE. 169 | 170 | ENDLOOP. 171 | 172 | mv_server_group = . 173 | 174 | DATA(lv_unused_wps) = COND i( WHEN iv_reserved_wps IS NOT INITIAL THEN iv_reserved_wps ELSE 1 ). 175 | DATA(lv_max_safe_wps) = nmax( val1 = ( lv_free_wps / 2 ) val2 = ( lv_free_wps - lv_unused_wps ) ). 176 | 177 | IF iv_max_wps IS NOT INITIAL. 178 | mv_max_tasks = iv_max_wps - lv_unused_wps. 179 | ELSEIF iv_max_percent BETWEEN 1 AND 100. 180 | mv_max_tasks = round( val = ( lv_free_wps / 100 ) * iv_max_percent dec = 0 mode = cl_abap_math=>round_down ) - lv_unused_wps. 181 | ELSE. 182 | mv_max_tasks = lv_max_safe_wps. 183 | ENDIF. 184 | 185 | IF mv_max_tasks <= 0. 186 | RAISE EXCEPTION TYPE zcx_bc_async_base 187 | EXPORTING 188 | textid = zcx_bc_async_base=>resource_error. 189 | ENDIF. 190 | 191 | IF iv_min_wps IS NOT INITIAL AND mv_max_tasks < iv_min_wps. 192 | RAISE EXCEPTION TYPE zcx_bc_async_base 193 | EXPORTING 194 | textid = zcx_bc_async_base=>min_wps_resource_error. 195 | ENDIF. 196 | 197 | ENDMETHOD. 198 | 199 | 200 | METHOD get_group. 201 | rv_group = mv_server_group. 202 | ENDMETHOD. 203 | 204 | 205 | METHOD get_next_task. 206 | LOOP AT mt_tasks ASSIGNING FIELD-SYMBOL() WHERE start_time IS INITIAL. 207 | EXIT. 208 | ENDLOOP. 209 | 210 | CHECK sy-subrc = 0. 211 | 212 | GET REFERENCE OF INTO rs_task. 213 | ENDMETHOD. 214 | 215 | 216 | METHOD get_tasks. 217 | rt_tasks = mt_tasks. 218 | ENDMETHOD. 219 | 220 | 221 | METHOD is_need_to_exclude_servers. 222 | rv_exclude = mv_exclude_servers_with_errors. 223 | ENDMETHOD. 224 | 225 | 226 | METHOD skip_task. 227 | GET TIME STAMP FIELD cs_task-start_time. 228 | GET TIME STAMP FIELD cs_task-end_time. 229 | mv_finished_tasks = mv_finished_tasks + 1. 230 | 231 | IF iv_timeout = abap_true. 232 | TRY. 233 | RAISE EXCEPTION TYPE zcx_bc_async_rfc_error 234 | EXPORTING 235 | textid = zcx_bc_async_rfc_error=>timeout. 236 | CATCH cx_root INTO cs_task-exception. 237 | ENDTRY. 238 | ENDIF. 239 | 240 | IF iv_attempts_exceeded = abap_true. 241 | TRY. 242 | RAISE EXCEPTION TYPE zcx_bc_async_rfc_error 243 | EXPORTING 244 | textid = zcx_bc_async_rfc_error=>attempts_exceeded. 245 | CATCH cx_root INTO cs_task-exception. 246 | ENDTRY. 247 | ENDIF. 248 | ENDMETHOD. 249 | 250 | 251 | METHOD start. 252 | DATA: 253 | lv_started_tasks TYPE i, 254 | lv_max_wps TYPE i. 255 | 256 | FIELD-SYMBOLS: 257 | TYPE ty_task. 258 | 259 | mv_running_tasks = 0. 260 | mv_finished_tasks = 0. 261 | DATA(lv_total_task_count) = lines( mt_tasks ). 262 | 263 | IF iv_message IS NOT INITIAL. 264 | cl_akb_progress_indicator=>get_instance(: )->stack_message( ), 265 | )->set_message( im_message = iv_message ). 266 | ENDIF. 267 | 268 | WHILE lv_started_tasks <> lv_total_task_count. 269 | IF mv_running_tasks >= mv_max_tasks AND mv_max_tasks IS NOT INITIAL. 270 | WAIT UNTIL mv_running_tasks < mv_max_tasks. 271 | ENDIF. 272 | 273 | DATA(lr_task) = get_next_task( ). 274 | IF lr_task IS INITIAL. 275 | EXIT. 276 | ENDIF. 277 | ASSIGN lr_task->* TO . 278 | 279 | TRY. 280 | -task->start_internal( lr_task ). 281 | GET TIME STAMP FIELD -start_time. 282 | mv_running_tasks = mv_running_tasks + 1. 283 | lv_started_tasks = lv_started_tasks + 1. 284 | 285 | IF iv_message IS NOT INITIAL. 286 | cl_akb_progress_indicator=>get_instance( )->display( total = lv_total_task_count 287 | processed = lv_started_tasks ). 288 | ENDIF. 289 | CATCH zcx_bc_async_rfc_error INTO DATA(lo_exception). 290 | 291 | WAIT UNTIL mv_finished_tasks >= lv_started_tasks 292 | UP TO mv_task_timeout SECONDS. 293 | 294 | IF sy-subrc = 0. 295 | -attempts = -attempts + 1. 296 | IF -attempts >= mv_max_attempts. 297 | lv_started_tasks = lv_started_tasks + 1. 298 | 299 | skip_task( EXPORTING iv_attempts_exceeded = abap_true 300 | CHANGING cs_task = ). 301 | ENDIF. 302 | ELSE. 303 | lv_started_tasks = lv_started_tasks + 1. 304 | 305 | skip_task( EXPORTING iv_timeout = abap_true 306 | CHANGING cs_task = ). 307 | ENDIF. 308 | 309 | CATCH cx_root INTO -exception. 310 | GET TIME STAMP FIELD -end_time. 311 | ENDTRY. 312 | 313 | ENDWHILE. 314 | 315 | WAIT UNTIL mv_finished_tasks >= lv_started_tasks. 316 | IF iv_message IS NOT INITIAL. 317 | cl_akb_progress_indicator=>get_instance( )->last_message( ). 318 | ENDIF. 319 | ENDMETHOD. 320 | 321 | 322 | METHOD task_complete. 323 | mv_finished_tasks = mv_finished_tasks + 1. 324 | mv_running_tasks = mv_running_tasks - 1. 325 | ENDMETHOD. 326 | ENDCLASS. 327 | -------------------------------------------------------------------------------- /src/zcl_bc_async_controller.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_BC_ASYNC_CONTROLLER 7 | E 8 | pRFC Tasks Controller 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | I 17 | 001 18 | Ошибка выделения ресурсов 19 | 34 20 | 21 | 22 | 23 | 24 | ZCL_BC_ASYNC_CONTROLLER 25 | ADD_TASK 26 | E 27 | Add new task 28 | 29 | 30 | ZCL_BC_ASYNC_CONTROLLER 31 | ADD_TASK 32 | R 33 | Добавить задачу 34 | 35 | 36 | ZCL_BC_ASYNC_CONTROLLER 37 | CLEAR_TASKS 38 | E 39 | Clear all tasks 40 | 41 | 42 | ZCL_BC_ASYNC_CONTROLLER 43 | CLEAR_TASKS 44 | R 45 | Очистка списка задач 46 | 47 | 48 | ZCL_BC_ASYNC_CONTROLLER 49 | CONSTRUCTOR 50 | E 51 | Initialization 52 | 53 | 54 | ZCL_BC_ASYNC_CONTROLLER 55 | CONSTRUCTOR 56 | R 57 | Инициализация 58 | 59 | 60 | ZCL_BC_ASYNC_CONTROLLER 61 | GET_GROUP 62 | E 63 | Get current server group 64 | 65 | 66 | ZCL_BC_ASYNC_CONTROLLER 67 | GET_GROUP 68 | R 69 | Получение группы серверов 70 | 71 | 72 | ZCL_BC_ASYNC_CONTROLLER 73 | GET_NEXT_TASK 74 | E 75 | Get next task 76 | 77 | 78 | ZCL_BC_ASYNC_CONTROLLER 79 | GET_NEXT_TASK 80 | R 81 | Получение следующей для выполнения задачи 82 | 83 | 84 | ZCL_BC_ASYNC_CONTROLLER 85 | GET_TASKS 86 | E 87 | Get tasks list 88 | 89 | 90 | ZCL_BC_ASYNC_CONTROLLER 91 | GET_TASKS 92 | R 93 | Получить обработанные задачи 94 | 95 | 96 | ZCL_BC_ASYNC_CONTROLLER 97 | IS_NEED_TO_EXCLUDE_SERVERS 98 | R 99 | Необходимость в исключении серверов 100 | 101 | 102 | ZCL_BC_ASYNC_CONTROLLER 103 | MT_TASKS 104 | E 105 | Список задач 106 | 107 | 108 | ZCL_BC_ASYNC_CONTROLLER 109 | MT_TASKS 110 | R 111 | Список задач 112 | 113 | 114 | ZCL_BC_ASYNC_CONTROLLER 115 | MV_FINISHED_TASKS 116 | E 117 | Завершенные задачи 118 | 119 | 120 | ZCL_BC_ASYNC_CONTROLLER 121 | MV_FINISHED_TASKS 122 | R 123 | Завершенные задачи 124 | 125 | 126 | ZCL_BC_ASYNC_CONTROLLER 127 | MV_MAX_ATTEMPTS 128 | E 129 | Максимальное значение попыток получения ресурсов для задачи 130 | 131 | 132 | ZCL_BC_ASYNC_CONTROLLER 133 | MV_MAX_ATTEMPTS 134 | R 135 | Максимальное значение попыток получения ресурсов для задачи 136 | 137 | 138 | ZCL_BC_ASYNC_CONTROLLER 139 | MV_MAX_TASKS 140 | E 141 | Максимальное число задействованных процессов 142 | 143 | 144 | ZCL_BC_ASYNC_CONTROLLER 145 | MV_MAX_TASKS 146 | R 147 | Максимальное число задействованных процессов 148 | 149 | 150 | ZCL_BC_ASYNC_CONTROLLER 151 | MV_RUNNING_TASKS 152 | E 153 | Работающие задачи 154 | 155 | 156 | ZCL_BC_ASYNC_CONTROLLER 157 | MV_RUNNING_TASKS 158 | R 159 | Работающие задачи 160 | 161 | 162 | ZCL_BC_ASYNC_CONTROLLER 163 | MV_SERVER_GROUP 164 | E 165 | Logon/Server Group Name 166 | 167 | 168 | ZCL_BC_ASYNC_CONTROLLER 169 | MV_SERVER_GROUP 170 | R 171 | Logon/Server Group Name 172 | 173 | 174 | ZCL_BC_ASYNC_CONTROLLER 175 | MV_TASK_TIMEOUT 176 | E 177 | Время ожидания задачи 178 | 179 | 180 | ZCL_BC_ASYNC_CONTROLLER 181 | MV_TASK_TIMEOUT 182 | R 183 | Время ожидания задачи 184 | 185 | 186 | ZCL_BC_ASYNC_CONTROLLER 187 | SKIP_TASK 188 | E 189 | Skip task 190 | 191 | 192 | ZCL_BC_ASYNC_CONTROLLER 193 | SKIP_TASK 194 | R 195 | Skip task 196 | 197 | 198 | ZCL_BC_ASYNC_CONTROLLER 199 | START 200 | E 201 | Start processing 202 | 203 | 204 | ZCL_BC_ASYNC_CONTROLLER 205 | START 206 | R 207 | Запуск выполнения задач 208 | 209 | 210 | ZCL_BC_ASYNC_CONTROLLER 211 | TASK_COMPLETE 212 | E 213 | Task complete 214 | 215 | 216 | ZCL_BC_ASYNC_CONTROLLER 217 | TASK_COMPLETE 218 | R 219 | Обработка завершения задачи 220 | 221 | 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /src/zcl_bc_async_task_base.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_bc_async_task_base DEFINITION 2 | PUBLIC 3 | CREATE PUBLIC 4 | 5 | GLOBAL FRIENDS zcl_bc_async_controller . 6 | 7 | PUBLIC SECTION. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | !iv_name TYPE guid_32 12 | !io_controller TYPE REF TO zcl_bc_async_controller 13 | RAISING 14 | zcx_bc_async_base . 15 | METHODS receive_internal 16 | IMPORTING 17 | !p_task TYPE guid_32 . 18 | METHODS get_name 19 | RETURNING 20 | VALUE(rv_name) TYPE guid_32 . 21 | protected section. 22 | 23 | data MV_TASK_NAME type GUID_32 . 24 | data MO_CONTROLLER type ref to ZCL_BC_ASYNC_CONTROLLER . 25 | data MR_TASK type ref to ZCL_BC_ASYNC_CONTROLLER=>TY_TASK . 26 | data MV_SERVER_GROUP type RZLLITAB-CLASSNAME . 27 | 28 | methods START 29 | exporting 30 | value(EV_SUBRC) type SYSUBRC 31 | !EV_MESSAGE type TEXT255 32 | raising 33 | ZCX_BC_ASYNC_RFC_ERROR . 34 | methods RECEIVE 35 | exporting 36 | !EV_SUBRC type SYSUBRC 37 | !EV_MESSAGE type TEXT255 . 38 | methods START_INTERNAL 39 | importing 40 | !IR_TASK type ref to ZCL_BC_ASYNC_CONTROLLER=>TY_TASK 41 | raising 42 | ZCX_BC_ASYNC_RFC_ERROR . 43 | methods EXCLUDE_SERVER . 44 | methods CHECK_START_RFC_EXCEPTION 45 | importing 46 | !IV_SUBRC type SYSUBRC 47 | !IV_MESSAGE type TEXT255 48 | raising 49 | ZCX_BC_ASYNC_RFC_ERROR . 50 | PRIVATE SECTION. 51 | 52 | ENDCLASS. 53 | 54 | 55 | 56 | CLASS ZCL_BC_ASYNC_TASK_BASE IMPLEMENTATION. 57 | 58 | 59 | METHOD check_start_rfc_exception. 60 | FIELD-SYMBOLS: 61 | TYPE zcl_bc_async_controller=>ty_task. 62 | 63 | CASE iv_subrc. 64 | WHEN 0. 65 | ASSIGN mr_task->* TO . 66 | CALL FUNCTION 'SPBT_GET_PP_DESTINATION' 67 | IMPORTING 68 | rfcdest = -rfcdest. 69 | WHEN zcl_bc_async_controller=>gc_rfc_errors-communication_failure OR 70 | zcl_bc_async_controller=>gc_rfc_errors-system_failure. 71 | exclude_server( ). 72 | WHEN zcl_bc_async_controller=>gc_rfc_errors-resource_failure. 73 | RAISE EXCEPTION TYPE zcx_bc_async_rfc_error 74 | EXPORTING 75 | textid = zcx_bc_async_rfc_error=>rfc_start_error 76 | mv_message = iv_message. 77 | WHEN OTHERS. 78 | ENDCASE. 79 | ENDMETHOD. 80 | 81 | 82 | METHOD constructor. 83 | IF iv_name IS INITIAL. 84 | RAISE EXCEPTION TYPE zcx_bc_async_base 85 | EXPORTING 86 | textid = zcx_bc_async_base=>initial_name. 87 | ENDIF. 88 | 89 | IF io_controller IS INITIAL. 90 | RAISE EXCEPTION TYPE zcx_bc_async_base 91 | EXPORTING 92 | textid = zcx_bc_async_base=>initial_controller. 93 | ENDIF. 94 | 95 | mv_task_name = iv_name. 96 | mv_server_group = io_controller->get_group( ). 97 | mo_controller = io_controller. 98 | ENDMETHOD. 99 | 100 | 101 | METHOD exclude_server. 102 | DATA: 103 | lv_rfc TYPE rfcdes-rfcdest, 104 | lv_server_name TYPE pbtsrvname. 105 | 106 | CHECK mo_controller->is_need_to_exclude_servers( ) = abap_true. 107 | 108 | CALL FUNCTION 'SPBT_GET_PP_DESTINATION' 109 | IMPORTING 110 | rfcdest = lv_rfc. 111 | 112 | lv_server_name = lv_rfc. 113 | 114 | CALL FUNCTION 'SPBT_DO_NOT_USE_SERVER' 115 | EXPORTING 116 | server_name = lv_rfc 117 | EXCEPTIONS 118 | OTHERS = 0. 119 | ENDMETHOD. 120 | 121 | 122 | METHOD get_name. 123 | rv_name = mv_task_name. 124 | ENDMETHOD. 125 | 126 | 127 | METHOD receive. 128 | ENDMETHOD. 129 | 130 | 131 | METHOD receive_internal. 132 | FIELD-SYMBOLS: 133 | TYPE zcl_bc_async_controller=>ty_task. 134 | 135 | mo_controller->task_complete( ). 136 | 137 | ASSIGN mr_task->* TO . 138 | IF sy-subrc = 0. 139 | GET TIME STAMP FIELD -end_time. 140 | ENDIF. 141 | 142 | TRY. 143 | receive( IMPORTING ev_subrc = DATA(lv_subrc) 144 | ev_message = DATA(lv_message) ). 145 | 146 | IF lv_subrc <> 0. 147 | IF lv_subrc = zcl_bc_async_controller=>gc_rfc_errors-communication_failure. 148 | exclude_server( ). 149 | ENDIF. 150 | 151 | RAISE EXCEPTION TYPE zcx_bc_async_rfc_error 152 | EXPORTING 153 | textid = zcx_bc_async_rfc_error=>rfc_receive_error 154 | mv_message = lv_message. 155 | ENDIF. 156 | 157 | CATCH zcx_bc_async_rfc_error INTO DATA(lo_exception). 158 | IF IS ASSIGNED. 159 | -exception = lo_exception. 160 | ENDIF. 161 | ENDTRY. 162 | ENDMETHOD. 163 | 164 | 165 | METHOD start. 166 | ENDMETHOD. 167 | 168 | 169 | METHOD start_internal. 170 | mr_task = ir_task. 171 | start( IMPORTING ev_subrc = DATA(lv_subrc) 172 | ev_message = DATA(lv_message) ). 173 | 174 | check_start_rfc_exception( iv_subrc = lv_subrc 175 | iv_message = lv_message ). 176 | ENDMETHOD. 177 | ENDCLASS. 178 | -------------------------------------------------------------------------------- /src/zcl_bc_async_task_base.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_BC_ASYNC_TASK_BASE 7 | E 8 | pRFC Task 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | ZCL_BC_ASYNC_TASK_BASE 17 | CONSTRUCTOR 18 | R 19 | Инициализация 20 | 21 | 22 | ZCL_BC_ASYNC_TASK_BASE 23 | EXCLUDE_SERVER 24 | R 25 | Исключить ошибочный сервер 26 | 27 | 28 | ZCL_BC_ASYNC_TASK_BASE 29 | GET_NAME 30 | R 31 | Получение имени задачи 32 | 33 | 34 | ZCL_BC_ASYNC_TASK_BASE 35 | MO_CONTROLLER 36 | R 37 | Управление асинхронными вызовами 38 | 39 | 40 | ZCL_BC_ASYNC_TASK_BASE 41 | MV_SERVER_GROUP 42 | R 43 | Logon/Server Group Name 44 | 45 | 46 | ZCL_BC_ASYNC_TASK_BASE 47 | MV_TASK_NAME 48 | R 49 | Имя задачи 50 | 51 | 52 | ZCL_BC_ASYNC_TASK_BASE 53 | RECEIVE 54 | R 55 | Получение результата 56 | 57 | 58 | ZCL_BC_ASYNC_TASK_BASE 59 | RECEIVE_INTERNAL 60 | R 61 | Получение результата с окончанием 62 | 63 | 64 | ZCL_BC_ASYNC_TASK_BASE 65 | START 66 | R 67 | Запуск задачи 68 | 69 | 70 | ZCL_BC_ASYNC_TASK_BASE 71 | START_INTERNAL 72 | R 73 | Запуск задачи из контроллера 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /src/zcx_bc_async_base.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCX_BC_ASYNC_BASE definition 2 | public 3 | inheriting from CX_STATIC_CHECK 4 | final 5 | create public . 6 | 7 | public section. 8 | 9 | interfaces IF_T100_MESSAGE . 10 | 11 | constants: 12 | begin of GROUP_NOT_FOUND, 13 | msgid type symsgid value 'ZBC_ASYNC', 14 | msgno type symsgno value '001', 15 | attr1 type scx_attrname value 'MV_GROUP', 16 | attr2 type scx_attrname value '', 17 | attr3 type scx_attrname value '', 18 | attr4 type scx_attrname value '', 19 | end of GROUP_NOT_FOUND . 20 | constants: 21 | begin of RESOURCE_ERROR, 22 | msgid type symsgid value 'ZBC_ASYNC', 23 | msgno type symsgno value '003', 24 | attr1 type scx_attrname value '', 25 | attr2 type scx_attrname value '', 26 | attr3 type scx_attrname value '', 27 | attr4 type scx_attrname value '', 28 | end of RESOURCE_ERROR . 29 | constants: 30 | begin of INITIAL_NAME, 31 | msgid type symsgid value 'ZBC_ASYNC', 32 | msgno type symsgno value '004', 33 | attr1 type scx_attrname value '', 34 | attr2 type scx_attrname value '', 35 | attr3 type scx_attrname value '', 36 | attr4 type scx_attrname value '', 37 | end of INITIAL_NAME . 38 | constants: 39 | begin of INITIAL_CONTROLLER, 40 | msgid type symsgid value 'ZBC_ASYNC', 41 | msgno type symsgno value '005', 42 | attr1 type scx_attrname value '', 43 | attr2 type scx_attrname value '', 44 | attr3 type scx_attrname value '', 45 | attr4 type scx_attrname value '', 46 | end of INITIAL_CONTROLLER . 47 | constants: 48 | begin of INITIALIZATION_ERROR, 49 | msgid type symsgid value 'ZBC_ASYNC', 50 | msgno type symsgno value '002', 51 | attr1 type scx_attrname value '', 52 | attr2 type scx_attrname value '', 53 | attr3 type scx_attrname value '', 54 | attr4 type scx_attrname value '', 55 | end of INITIALIZATION_ERROR . 56 | constants: 57 | begin of MIN_WPS_RESOURCE_ERROR, 58 | msgid type symsgid value 'ZBC_ASYNC', 59 | msgno type symsgno value '009', 60 | attr1 type scx_attrname value '', 61 | attr2 type scx_attrname value '', 62 | attr3 type scx_attrname value '', 63 | attr4 type scx_attrname value '', 64 | end of MIN_WPS_RESOURCE_ERROR . 65 | data MV_GROUP type RZLLITAB-CLASSNAME . 66 | 67 | methods CONSTRUCTOR 68 | importing 69 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional 70 | !PREVIOUS like PREVIOUS optional 71 | !MV_GROUP type RZLLITAB-CLASSNAME optional . 72 | protected section. 73 | private section. 74 | ENDCLASS. 75 | 76 | 77 | 78 | CLASS ZCX_BC_ASYNC_BASE IMPLEMENTATION. 79 | 80 | 81 | method CONSTRUCTOR. 82 | CALL METHOD SUPER->CONSTRUCTOR 83 | EXPORTING 84 | PREVIOUS = PREVIOUS 85 | . 86 | me->MV_GROUP = MV_GROUP . 87 | clear me->textid. 88 | if textid is initial. 89 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID. 90 | else. 91 | IF_T100_MESSAGE~T100KEY = TEXTID. 92 | endif. 93 | endmethod. 94 | ENDCLASS. 95 | -------------------------------------------------------------------------------- /src/zcx_bc_async_base.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_BC_ASYNC_BASE 7 | E 8 | pRFC Control Exception 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 |
18 | 0242AC1100021EDB8CAAAD9FDA7A917C 19 | E 20 | 1 21 | CA== 22 |
23 | 24 | 25 | 0242AC1100021EDB8CAAAD9FDA7A917C 26 | E 27 | 0001 28 | X 29 | R 30 | 255 31 | 32 | 33 |
34 |
35 | 36 | 37 | LIMU 38 | CPUB 39 | ZCX_BC_ASYNC_BASE 40 | 0242AC1100021EDB8CAAAD9FDA7A917C 41 | 0001 42 | 43 | 44 | 45 | 46 | ZCX_BC_ASYNC_BASE 47 | CONSTRUCTOR 48 | E 49 | CONSTRUCTOR 50 | 51 | 52 | ZCX_BC_ASYNC_BASE 53 | CONSTRUCTOR 54 | R 55 | CONSTRUCTOR 56 | 57 | 58 | ZCX_BC_ASYNC_BASE 59 | MV_GROUP 60 | E 61 | Logon/Server Group Name 62 | 63 | 64 | ZCX_BC_ASYNC_BASE 65 | MV_GROUP 66 | R 67 | Logon/Server Group Name 68 | 69 | 70 |
71 |
72 |
73 | -------------------------------------------------------------------------------- /src/zcx_bc_async_rfc_error.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCX_BC_ASYNC_RFC_ERROR definition 2 | public 3 | inheriting from CX_STATIC_CHECK 4 | final 5 | create public . 6 | 7 | public section. 8 | 9 | *"* public components of class ZCX_SB_D7737_RESOURCE 10 | *"* do not include other source files here!!! 11 | interfaces IF_T100_MESSAGE . 12 | 13 | constants: 14 | BEGIN OF rfc_start_error, 15 | msgid TYPE symsgid VALUE 'ZBC_ASYNC', 16 | msgno TYPE symsgno VALUE '006', 17 | attr1 TYPE scx_attrname VALUE 'MV_MESSAGE', 18 | attr2 TYPE scx_attrname VALUE '', 19 | attr3 TYPE scx_attrname VALUE '', 20 | attr4 TYPE scx_attrname VALUE '', 21 | END OF rfc_start_error . 22 | constants: 23 | BEGIN OF timeout, 24 | msgid TYPE symsgid VALUE 'ZBC_ASYNC', 25 | msgno TYPE symsgno VALUE '007', 26 | attr1 TYPE scx_attrname VALUE '', 27 | attr2 TYPE scx_attrname VALUE '', 28 | attr3 TYPE scx_attrname VALUE '', 29 | attr4 TYPE scx_attrname VALUE '', 30 | END OF timeout . 31 | constants: 32 | BEGIN OF attempts_exceeded, 33 | msgid TYPE symsgid VALUE 'ZBC_ASYNC', 34 | msgno TYPE symsgno VALUE '008', 35 | attr1 TYPE scx_attrname VALUE '', 36 | attr2 TYPE scx_attrname VALUE '', 37 | attr3 TYPE scx_attrname VALUE '', 38 | attr4 TYPE scx_attrname VALUE '', 39 | END OF attempts_exceeded . 40 | constants: 41 | begin of RFC_RECEIVE_ERROR, 42 | msgid type symsgid value 'ZBC_ASYNC', 43 | msgno type symsgno value '010', 44 | attr1 type scx_attrname value 'MV_MESSAGE', 45 | attr2 type scx_attrname value '', 46 | attr3 type scx_attrname value '', 47 | attr4 type scx_attrname value '', 48 | end of RFC_RECEIVE_ERROR . 49 | data MV_MESSAGE type TEXT255 . 50 | 51 | 52 | methods CONSTRUCTOR 53 | importing 54 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional 55 | !PREVIOUS like PREVIOUS optional 56 | !MV_MESSAGE type TEXT255 optional . 57 | protected section. 58 | *"* protected components of class ZCX_SB_D7737_RESOURCE 59 | *"* do not include other source files here!!! 60 | private section. 61 | *"* private components of class ZCX_SB_D7737_RESOURCE 62 | *"* do not include other source files here!!! 63 | ENDCLASS. 64 | 65 | 66 | 67 | CLASS ZCX_BC_ASYNC_RFC_ERROR IMPLEMENTATION. 68 | 69 | 70 | method CONSTRUCTOR. 71 | CALL METHOD SUPER->CONSTRUCTOR 72 | EXPORTING 73 | PREVIOUS = PREVIOUS 74 | . 75 | me->MV_MESSAGE = MV_MESSAGE . 76 | clear me->textid. 77 | if textid is initial. 78 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID. 79 | else. 80 | IF_T100_MESSAGE~T100KEY = TEXTID. 81 | endif. 82 | endmethod. 83 | ENDCLASS. 84 | -------------------------------------------------------------------------------- /src/zcx_bc_async_rfc_error.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_BC_ASYNC_RFC_ERROR 7 | E 8 | pRFC Resourse exception 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | ZCX_BC_ASYNC_RFC_ERROR 18 | CONSTRUCTOR 19 | R 20 | CONSTRUCTOR 21 | 22 | 23 | ZCX_BC_ASYNC_RFC_ERROR 24 | MV_MESSAGE 25 | R 26 | Text, 255 Characters 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/zsbt_d7737_server_group.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZSBT_D7737_SERVER_GROUP 7 | RZLLI_APCL 8 | E 9 | CHAR 10 | 000020 11 | T 12 | D 13 | N 14 | 15 | 16 | 17 | 18 | --------------------------------------------------------------------------------