BTP - Application Job (Exit Notification)
Wofür kann man die Exits im Application Job verwenden und wie werden diese ausgeprägt? In diesem Artikel erfährst du mehr dazu.
Inhaltsverzeichnis
Im letzten Artikel hatten wir uns mit der Anlage des Application Jobs beschäftigt und unseren ersten lauffähigen Job gebaut. Dabei sind uns bereits die ersten Exits im Job-Catalog aufgefallen. Diese wollen wir uns in diesem Artikel einmal genauer ansehen und was wir damit machen können.
Einleitung
Nach der Anlage des Job-Katalogs landen wir im Formular und das Objekt steht in den ABAP Development Tools zur Verfügung. Im oberen Abschnitt finden wir unsere Ausführungsklasse, in der die Parameter und die Ausführung definiert ist.
Im unteren Abschnitt stehen drei Exits zur Verfügung für Prüfungen, Wertehilfen und Benachrichtigungen. In diesem Artikel werden wir dir die Prüfungen näher vorstellen.
Implementierung
Wie bereits für die Prüfungen, können wir die Klasse mit einem Klick auf den Link im Job-Katalog anlegen und erhalten den Standard Wizard für Klassen.
Leider wird auch in diesem Fall kein Interface vorbelegt und wir müssen das Interface IF_APJ_RT_JOB_NOTIF_EXIT selbst hinterlegen und per Quick Fix (STRG + 1) die Methoden anlegen. Anders als bei den Prüfungen, sind die Methoden im Interface nicht per DEFAULT implementiert, sodass der Quick Fix funktioniert.
CLASS zcl_bs_demo_job_adt_ntf DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES IF_APJ_RT_JOB_NOTIF_EXIT.
ENDCLASS.
CLASS zcl_bs_demo_job_adt_ntf IMPLEMENTATION.
METHOD if_apj_rt_job_notif_exit~notify_jt_start.
ENDMETHOD.
METHOD if_apj_rt_job_notif_exit~notify_jt_end.
ENDMETHOD.
ENDCLASS.
Methoden
Im folgenden Abschnitt beschreiben wir nun die einzelnen Methoden aus dem Interface und wann sie aufgerufen werden, leider ist die Dokumentation dafür nicht mehr ganz so umfangreich.
NOTIFY_JT_START
Die Methode wird aktuell noch nicht aufgerufen oder unterstützt, leider bekommt man den Hinweis nur über die Outlines. Da das Interface scheinbar über die SE24 angelegt wurde (Parameter mit ! und Texte in den Outlines), fehlen auch noch die ABAP Docs, die wahrscheinlich mit den nächsten Releases ausgeliefert werden.
Hinweis: Getestet hatten wir den Aufruf, indem wir einen Dump erzeugen, wenn die Methode aufgerufen wird, dies war aktuell noch nicht der Fall.
NOTIFY_JT_END
Nach etwas Testen wird die Methode nur dann aufgerufen, wenn der Job auf Fehler läuft. Wird der Job ohne Fehler beendet, dann wird der Exit nicht angesteuert. Um in der Ausführungsklasse einen Fehler zu provozieren, muss nur die Ausnahme der Methode EXECUTE ausgelöst werden, dann wird der Job automatisch auf Fehler gestellt und unser Exit wird aufgerufen.
RAISE EXCEPTION NEW cx_apj_rt_content( ).
Wir erhalten in der Methode verschiedene Informationen zum Job, dem Schritt dem Job-Katalog und die Job-Info, die aber nur Name und Count enthält.
Damit wir nun eine Benachrichtigung erzeugen können, benötigen wir noch weitere Informationen zum Job. Dabei bedienen wir uns der freigegebenen API, um weitere Informationen zum Job zu lesen. Damit erhalten wir Zugriff auf den Job-Ersteller, Laufzeiten und Status.
DATA(ls_job_details) = cl_apj_rt_api=>get_job_details( iv_jobname = is_job_info-job_name
iv_jobcount = is_job_info-job_count ).
Dazu lesen wir noch die Mail des Job-Erstellers nach, formatieren die Job-Info für die E-Mail und senden die Mail, um diese dann zu validieren.
Benachrichtigung
Planen wir nun den Job noch einmal ein, dann sollte dieser nun auf Fehler laufen und eine Benachrichtigung an uns versandt werden.
In der E-Mail finden wir nun die aufbereiteten Job-Informationen als JSON, um noch einmal zu validieren, welche Informationen vorhanden sind. Die eigentliche Implementierung funktioniert nun so weit.
Komplettes Beispiel
Hier findest du die vollständige Exit-Klasse mit den Hilfsmethoden zur Aufbereitung des Contents für die Mail und dem Lesen der Mail des Job-Erstellers. Wie man den E-Mail-Versand einrichtet und Mails verschickt, erklären wir in anderen Artikeln auf dem Blog.
CLASS zcl_bs_demo_job_adt_ntf DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_apj_rt_job_notif_exit.
PRIVATE SECTION.
METHODS send_mail
IMPORTING id_receiver TYPE cl_bcs_mail_message=>ty_address
id_subject TYPE string
id_content TYPE string.
METHODS format_json_content
IMPORTING is_job_details TYPE cl_apj_rt_api=>ty_job_info
RETURNING VALUE(rd_result) TYPE string.
ENDCLASS.
CLASS zcl_bs_demo_job_adt_ntf IMPLEMENTATION.
METHOD if_apj_rt_job_notif_exit~notify_jt_start.
" Currently not working
ENDMETHOD.
METHOD if_apj_rt_job_notif_exit~notify_jt_end.
DATA(ls_job_details) = cl_apj_rt_api=>get_job_details( iv_jobname = is_job_info-job_name
iv_jobcount = is_job_info-job_count ).
SELECT SINGLE FROM I_BusinessUserVH
FIELDS DefaultEmailAddress
WHERE UserID = @ls_job_details-job_user
INTO @DATA(ld_mail).
DATA(ld_json_formatted) = format_json_content( ls_job_details ).
send_mail( id_receiver = CONV #( ld_mail )
id_subject = |Error in Job: { is_job_info-job_name }|
id_content = ld_json_formatted ).
ENDMETHOD.
METHOD send_mail.
TRY.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_sender( 'BTP-noreply@CONNECT.com' ).
lo_mail->add_recipient( id_receiver ).
lo_mail->set_subject( CONV #( id_subject ) ).
lo_mail->set_main( cl_bcs_mail_textpart=>create_instance( iv_content = id_content
iv_content_type = 'text/html' ) ).
lo_mail->send( ).
CATCH cx_bcs_mail INTO DATA(lo_error).
RAISE SHORTDUMP lo_error.
ENDTRY.
ENDMETHOD.
METHOD format_json_content.
DATA(ld_content) = /ui2/cl_json=>serialize( data = is_job_details
format_output = abap_true ).
rd_result = replace( val = ld_content sub = cl_abap_char_utilities=>cr_lf with = '<br>' occ = 0 ).
ENDMETHOD.
ENDCLASS.
Anmerkungen
Ohne ABAP-Mittel kann auch über Cloud ALM eine E-Mail gesendet werden, wenn ein Job im ABAP Environment auf Fehler läuft. Mit ABAP hat man mehr Möglichkeiten auf Fehler zu reagieren, hier empfiehlt sich aber auch eine Re-Use Komponente, wenn du immer wieder Mails schicken möchtest, vor allem für die Verwaltung der Mail-Texte und Empfänger.
Fazit
Wenn ein Job im System abbricht, besitzt du nun eine einfache Möglichkeit eine E-Mail zu versenden, um über den Abbruch zu informieren. Anstatt einer E-Mail kann auch ein Re-Schedule angetriggert oder eine Nachverarbeitung durchgeführt werden.