Nutzung von Jasper Scriptlets in Kombination mit der Talend MetaServlet API

In diesem Blogbeitrag geht es zum einen um die Erstellung von Jasper Scriptlets. Innerhalb eines solchen Scriptlets wird anschließend beschrieben, wie die Talend MetaServlet API, welche vom TAC bereitgestellt wird, genutzt werden kann. Diese ermöglicht es, Talend Jobs welche auf dem TAC deployed sind, von außerhalb aufzurufen. Damit können Jobs zum Beispiel vor dem Aufrufen eines Berichtes ausgeführt werden. Mit Jasper Scriptlets und der MetaServlet API von Talend lässt sich dies geschickt lösen.

Erstellung und Nutzung eines JasperSoft Scriptlets

Zunächst wird ein einfaches Scriptlet-Beispiel gezeigt, mit welchem ein String im Summary-Band des Berichts angedruckt werden kann. Für die Erstellung des Scriptlets empfiehlt sich Eclipse als Java Editor. Weiterhin wird die JasperServer jar aus der Installation des JasperServers benötigt. In diesem Beispiel ist der jasperreports-server 6.4.2 installiert.

1) Anlegen eines neuen Projects
I. File -> New -> Java Project -> Name des Projects (z.B. Test)

2) JasperServer jar File zum Project hinzufügen
I. Rechtsklick auf den Project Name -> Build Path -> Configure Build Path -> Libraries -> Add External Jar Files -> Das Jar File aus untenstehendem Pfad hinzufügen
II. C:\Jaspersoft\jasperreports-server-6.4.2\apache-tomcat\webapps\jasperserver-pro\WEB-INF\lib
III. Filename: jasperreports-6.4.2.jar 

3) Erstellen eines Packages und einer Klasse
I. Package Name: com.jasper.test
II. Klasse: TestScriptlet
III. Der erstellte Code soll einen einfachen String zurückgeben

4) Exportieren des Projekts als Jar Datei
I. Rechtsklick auf das Project Test -> Export -> Jar File unter Java
II. Dateiname: test.jar

5) Nutzung des eigenen Codes als Scriptlet im JasperSoft Studio
I. Dazu muss das Jar-File im Build-Path im Studio hinzugefügt werden

Die hello-Funktion dieses Jasper Scriptlets kann anschließend im Jasper Bericht aufgerufen und ausgegeben werden. Dazu muss die Scriptlet-Klasse im Bericht unter Scriptlets hinzugefügt werden:

1) Hinzufügen des Scriptlets in der Outline: Rechtsklick auf Scriptlets  -> Create Scriptlet
2) Auswählen der Scriptlet-Klasse
3) Aufruf der hello()-Funktion des Scriptlets: Diese gibt den im Code definierten String zurück

Talend MetaServlet – Aufruf über REST-Schnittstelle

Die Talend MetaServlet API kann über die angebotene REST-Schnittstelle aufgerufen werden. Es ist möglich, Talend Jobs welche auf dem TAC deployed sind, über HTTP Get requests auszuführen. Diese Aufrufe können auch mit Java Code implementiert werden. Damit ist der Aufruf über ein Jasper Scriptlet möglich.

Alle Operationen des MetaServlets können durch HTTP Get Anfragen aufgerufen werden. Die Parameter der Aufrufe werden innerhalb eines BASE-64 kodierten Strings mitgegeben.
Das Command Line Tool des MetaServlets kann in folgenden Ordnern der TAC-Installation gefunden werden:

<tomcat_path>/webapps/org.talend.administrator/WEB-INF/classes/MetaServletCaller.bat für Windows
<tomcat_path>/webapps/org.talend.administrator/WEB-INF/classes/MetaServletCaller.sh für Linux

Ausführen eines Jobs im TAC über den Browser:

Im Folgenden wird gezeigt wie der Beispiel Talend Job TEST_JOB_SCRIPTLET zum einen über einen Rest Call im Web Browser und programmatisch ausgeführt werden kann.

Für den Aufruf eines Talend Jobs wird die TaskID, welche vom System beim Deployen auf dem TAC generiert wird, benötigt. Soll der Talend Job programmatisch ausgeführt werden dann kann dazu die Methode getTaskIdByName aufgerufen werden.

Die TaskID des Beispiel Talend Jobs kann im TAC unter den Spalten im Job Conductor eingesehen werden. Für den Talend Job TEST_JOB_SCRIPTLET ist die ID 421.

Dieser Talend Job kann über die Methode runTask ausgeführt werden. Die zuvor geholte ID wird dafür im Rest-Aufruf benötigt:

Dieses JSON kann über die metaServlet API als Argument mitgegeben werden und muss vorher als base64 String kodiert werden.
base64-String:

ewogICJhY3Rpb25OYW1lIjogInJ1blRhc2siLAogICJhdXRoUGFzcyI6ICJhZG1pbiIsCiAgImF1

dGhVc2VyIjogImFkbWluQGNvbXBhbnkuY29tIiwKICAianZtUGFyYW1zIjogWwogICAgIi1YbX

gyNTZtIiwKICAgICItWG1zNjRtIgogIF0sCiAgIm1vZGUiOiAic3luY2hyb25vdXMiLAogICJ0YXNrSWQiOiA0MjEKfQ==

Der Aufruf sieht wie folgt aus:

Ist das TAC auf der der lokalen Maschine installiert, muss folgender HTTP Get Aufruf ausgeführt werden:

Sofern der Aufruf korrekt ist, wird der Talend Job gestartet und steht im TAC auf Running.

Talend MetaServlet – Aufruf mittels Java-Code

Das Talend Meta-Servlet kann auch über Java Code angesteuert werden. Damit besteht die Möglichkeit, Talend-Jobs welche auf dem TAC veröffentlich wurden, auszuführen.
Als Editor zum Erstellen des Scriptlets bietet sich Eclipse an. Zunächst muss die jar der JasperServer Installation dem Build Path des Projekts im Eclipse hinzugefügt werden. Nur so können die JR Scriptlet Klassen benutzt werden.

Im Java Code werden anschließend die benötigten Klassen importiert.

Diese Klassen bieten einige abstrakte Methoden an, auf welche bei der Java-Implementierung zurückgegriffen werden kann. In diesem Beispiel wird die Methode beforeReportInit() benutzt. Damit wird der Talend Job vor dem Generieren des Jasper Berichts ausgeführt. (weitere Methoden -> https://www.tutorialspoint.com/jasper_reports/jasper_report_scriptlets.htm)
Parameterwerte des Jasper Berichts, in welchem das Scriptlet zum Einsatz kommen soll, können über folgende Funktion innerhalb des Java Codes abgerufen werden:

Im nächsten Schritt muss das JSON für die Methode getTaskIdByName erzeugt werden. Im Java Code für das Jasper Scriptlet sieht dies wie folgt aus:

Da ein JSON zurückgegeben wird, muss aus diesem die taskID extrahiert werden. Folgende Klassen wurden in diesem Beispiel für die Realisierung verwendet:

Da nun die benötigte TaskID bekannt ist, kann das JSON für die runTask Methode erstellt und über die URL-Klasse aufgerufen werden. In diesem Aufruf können dem Talend Job Kontextwerte mitgegeben werden. Voraussetzung dafür ist, dass diese Kontexte im Talend Job angelegt sind. Der Runmode wurde auf synchronous gesetzt, damit auf das Beenden der Ausführung des Talend Jobs gewartet wird.

Beim RunTask Request bewirkt das Öffnen der URL Connection das Starten der Ausführung des Talend Jobs.
Wie im ersten Abschnitt Erstellung und Nutzung eines JasperSoft Scriptlets beschrieben, muss der Code im Eclipse als JAR exportiert und im Jasper Bericht eingebunden werden.

Wenn alles fertig konfiguriert ist, dann wird beim Starten des Jasper Berichts zunächst das Jasper Scriptlet ausgeführt. Der eingebundene Java Code wird ausgeführt und der Talend Job auf dem TAC gestartet, bevor der Bericht erzeugt wird.

Quellen: 

https://help.talend.com/reader/YcEtLnE30CM8SeOxtXyHYQ/~iTsQ113uerQ~w_Xekv41g

https://www.tutorialspoint.com/jasper_reports/jasper_report_scriptlets.htm

Prodato verbindet.

Autor

Patrick Gelbrich
Lead Consultant

patrick.gelbrich@prodato.de