Show TOC

HintergrundProgrammierbeispiel für aRFC Dieses Dokument in der Navigationsstruktur finden

 

Das folgende Beispiel zeigt eine parallele asynchrone Verarbeitung des Funktionsbausteins RFC_SYSTEM_INFO über asynchrone Remote Function Calls.

Es erfolgen zehn Aufrufe, die durch unterschiedliche Aufgabenkennungen name in jeweils eigenen Workprozessen ablaufen. In der Callback-Routine rfc_info werden die beendeten Funktionsbausteine gezählt und Informationen über das Zielsystem empfangen.

Durch den Zusatz GROUP DEFAULT wird die Ausführung auf alle Applikationsserver des aktuellen Systems verteilt. Ist nach mindestens einem erfolgreichen Aufruf kein freier Workprozess mehr vorhanden, wird die Ausführung des Programms unterbrochen, bis alle bis dahin gestarteten Funktionsbausteine beendet wurden. Diese Unterbrechung ist auf maximal 5 Sekunden begrenzt.

Nach dem Start aller Funktionsbausteine wird gewartet, bis alle Callback-Routinen ausgeführt wurden. Danach wird die dort gefüllte interne Tabelle task_list ausgegeben. Die Ausgabe zeigt, in welcher Reihenfolge die einzelnen Aufgaben beendet und auf welchem Applikationsserver sie jeweils ausgeführt wurden.

TYPES: BEGIN OF task_type,

name TYPE string,

dest TYPE string,

END OF task_type.

DATA: snd_jobs TYPE i,

rcv_jobs TYPE i,

exc_flag TYPE i,

info TYPE rfcsi,

mess TYPE c LENGTH 80,

indx TYPE c LENGTH 4,

name TYPE c LENGTH 8,

task_list TYPE STANDARD TABLE OF task_type,

task_wa TYPE task_type.

DO 10 TIMES.

indx = sy-index.

CONCATENATE 'Task' indx INTO name.

CALL FUNCTION 'RFC_SYSTEM_INFO'

STARTING NEW TASK name

DESTINATION IN GROUP DEFAULT

PERFORMING rfc_info ON END OF TASK

EXCEPTIONS

system_failure = 1 MESSAGE mess

communication_failure = 2 MESSAGE mess

resource_failure = 3.

CASE sy-subrc.

WHEN 0.

snd_jobs = snd_jobs + 1.

WHEN 1 OR 2.

MESSAGE mess TYPE 'I'.

WHEN 3.

IF snd_jobs >= 1 AND

exc_flag = 0.

exc_flag = 1.

WAIT UNTIL rcv_jobs > = snd_jobs

UP TO 5 SECONDS.

ENDIF.

IF sy-subrc = 0.

exc_flag = 0.

ELSE.

MESSAGE 'Resource failure' TYPE 'I'.

ENDIF.

WHEN OTHERS.

MESSAGE 'Other error' TYPE 'I'.

ENDCASE.

ENDDO.

WAIT UNTIL rcv_jobs >= snd_jobs.

LOOP AT task_list INTO task_wa.

WRITE: / task_wa-name, task_wa-dest.

ENDLOOP.

FORM rfc_info USING name.

task_wa-name = name.

rcv_jobs = rcv_jobs + 1.

RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'

IMPORTING

rfcsi_export = info

EXCEPTIONS

system_failure

= 1 MESSAGE mess

communication_failure = 2 MESSAGE mess.

IF sy-subrc = 0.

task_wa-dest = info-rfcdest.

ELSE.

task_wa-dest = mess.

ENDIF.

APPEND task_wa TO task_list.

ENDFORM.