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.