├── .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 | 
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 |
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 |
--------------------------------------------------------------------------------