Integration von RPG und Java auf System-i/Power/AS400 mittels Dataqueues
Eine spannende Methode, um RPG-Programme auf System-i, Power Systems oder AS400 mit modernen Java-Anwendungen zu integrieren, bietet die Nutzung von Dataqueues. In diesem Artikel zeigen wir, wie Dataqueues für den Datenaustausch zwischen RPG und Java effizient genutzt werden können. Dies ermöglicht eine einfache und flexible Erweiterung bestehender RPG-Anwendungen durch moderne Webtechnologien.
Unser spezifisches Beispiel demonstriert die Nutzung von Dataqueues, um einen Webservice aufzurufen. Hierzu schreiben wir eine URL in eine Queue, lassen diese durch einen Java-basierten REST-Client aufrufen und das Ergebnis wird an eine zweite Queue zurückgegeben. Ein solches Setup bietet eine hervorragende Möglichkeit, die Funktionen eines RPG-Programms zu erweitern, ohne tiefgreifende Änderungen am bestehenden Code vornehmen zu müssen.
Da uns die APIs QSNDDTAQ
und QRCVDTAQ
nicht zur Verfügung stehen, demonstrieren wir den kompletten Lifecycle der Integration und Kommunikation über Java. Dies zeigt die Vielseitigkeit und Anpassungsfähigkeit von Java bei der Überbrückung technologischer Lücken zwischen verschiedenen Systemen.
JTOpen bietet mit der Klasse com.ibm.as400.access.AS400
eine leistungsstarke API für Java-Anwendungen, um auf IBM i Systeme zuzugreifen. Diese Bibliothek ermöglicht es Entwicklern, eine Vielzahl von Systemoperationen wie Datenbankzugriffe, Dateisysteminteraktionen und sogar das Aufrufen von Programmen und Befehlen auf der AS400 durchzuführen. Die Flexibilität und Robustheit von JTOpen machen es zu einem unverzichtbaren Werkzeug für Java-Entwickler, die mit IBM i Systemen arbeiten. Es bietet eine vereinfachte, objektorientierte Schnittstelle zu vielen der traditionellen Funktionen des Systems, wodurch Entwickler in der Lage sind, moderne Anwendungen zu erstellen, die nahtlos mit Legacy-Systemen interagieren.
Beispiel für den Aufbau einer Verbindung zum IBM i System mit Java
public AS400 getAs400() {
if (as400 == null) {
try {
as400 = new AS400(
config.getAs400System(),
config.getAs400Username(),
config.getAs400Password());
LOGGER.info("AS400 connection successfully initialized.");
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failed to initialize AS400 connection.", e);
}
}
return as400;
}
Dieses Code-Snippet ermöglicht den Aufbau einer Verbindung zu einem IBM i System (AS400) mit Java. Es prüft, ob bereits eine Verbindung besteht, und initialisiert diese bei Bedarf mit spezifischen Zugangsdaten. Bei erfolgreicher Verbindung wird eine Bestätigungsnachricht geloggt; bei einem Fehler wird eine Fehlermeldung ausgegeben. Dieser Prozess stellt eine effiziente und sichere Methode dar, um mit dem IBM i System zu interagieren.
Erstellung von Data Queues auf IBM i mit Java
public DataQueue createOrOpenDataQueue(String library, String queueName) {
DataQueue queue = null;
try {
String path = QSYSObjectPathName.toPath(library, queueName, Config.DTAQ);
queue = new DataQueue(System400Manager.getInstance().getAs400(), path);
if (!queue.exists()) {
LOGGER.info(String.format("Data Queue [%s] does not exist," +
" creating new one.", queueName));
DataQueueAttributes attributes = new DataQueueAttributes();
queue.create(attributes);
LOGGER.info(String.format("Data Queue [%s] created.", queueName));
} else {
LOGGER.info(String.format("Data Queue [%s] already exists.", queueName));
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE,
String.format("Failed to create Data Queue [%s] .", queueName), e);
}
return queue;
}
Dieses Snippet zeigt, wie man in Java eine Datenwarteschlange (Data Queue) auf einem IBM i System erstellt oder öffnet, indem man die JTOpen-Bibliothek verwendet. Es demonstriert die effiziente Handhabung von Data Queues, einschließlich der Überprüfung ihrer Existenz und der Erstellung neuer Queues, falls erforderlich.
Integration von IBM i Data Queues mit REST-Web-Services
// Read Queue and perform Call
public void processQueueAndCallREST() {
try {
// Read Message from queue
DataQueueEntry entry = this.queueManager.getRpgToJava().read(-1);
String message = new String(entry.getData(), StandardCharsets.UTF_8);
// Perform REST-Call
String response = performRestCall(message);
// Send Answer to second queue;
this.queueManager.getJavaToRpg().write(response.getBytes(StandardCharsets.UTF_8));
LOGGER.info("REST call response successfully sent back to RPG program.");
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Error processing queue and calling REST", e);
}
}
Dieses Snippet illustriert, wie eine Java-Anwendung eine Nachricht aus einer Data Queue liest, einen REST-Aufruf basierend auf dieser Nachricht durchführt und die Antwort in einer zweiten Queue speichert. Es demonstriert beispielhaft aber effektiv die Integration zwischen einem IBM i System und externen Web-Services. Der Prozess beginnt mit dem Lesen einer Nachricht, setzt sich mit einem Web-Service-Aufruf fort und endet damit, dass die Antwort für das aufrufende Programm verfügbar gemacht wird
Testbeispiel: Abruf von zufälligen Witzen
Im Rahmen unseres Testbeispiels integrieren wir einen Webservice, der zufällige Witze liefert. Dieser Vorgang wird mittels Dataqueues koordiniert, wobei eine URL an die Queue [RP2JQ]
gesendet und das Ergebnis aus der Queue [J2RPQ]
empfangen wird.
java -cp "zeus-access-400-1.0-SNAPSHOT.jar;jt400.jar" de.zeus.hermes.AppInitializer application.properties --runMode queueTest
Das folgende Logfile zeigt detailliert den Ablauf des Vorgangs:
Mär 16, 2024 3:10:12 PM de.zeus.hermes.util.PropertiesLoader loadProperties
INFORMATION: Properties file application.properties successfully loaded from the file system.
Mär 16, 2024 3:10:12 PM de.zeus.hermes.manager.QueueManager manageDataQueue
INFORMATION: Managing Data Queue.
Mär 16, 2024 3:10:12 PM de.zeus.hermes.manager.System400Manager getAs400
INFORMATION: AS400 connection successfully initialized.
Mär 16, 2024 3:10:13 PM de.zeus.hermes.manager.QueueManager createOrOpenDataQueue
INFORMATION: Data Queue [J2RPQ] already exists.
Mär 16, 2024 3:10:13 PM de.zeus.hermes.manager.QueueManager createOrOpenDataQueue
INFORMATION: Data Queue [RP2JQ] already exists.
Mär 16, 2024 3:10:13 PM de.zeus.hermes.manager.QueueManager clearDataQueue
INFORMATION: Data Queue [J2RPQ] successfully cleared.
Mär 16, 2024 3:10:13 PM de.zeus.hermes.manager.QueueManager clearDataQueue
INFORMATION: Data Queue [RP2JQ] successfully cleared.
INFORMATION: Sending Message to queue: https://official-joke-api.appspot.com/random_joke
Mär 16, 2024 3:10:13 PM de.zeus.hermes.DataQueueServiceTest writeToQueue
INFORMATION: Message successfully written to the queue.
Mär 16, 2024 3:10:15 PM de.zeus.hermes.service.DataQueueService performRestCall
INFORMATION: Received data from REST call: {"type":"general","setup":"I started a new business making yachts in my attic this year...","punchline":"The sails are going through the roof.","id":68}
Mär 16, 2024 3:10:15 PM de.zeus.hermes.service.DataQueueService processQueueAndCallREST
INFORMATION: REST call response successfully sent back to RPG program.
Mär 16, 2024 3:10:15 PM de.zeus.hermes.DataQueueServiceTest runTest
INFORMATION: REST-Call result: {"type":"general","setup":"I started a new business making yachts in my attic this year...","punchline":"The sails are going through the roof.","id":68}
Wie im Log ersichtlich, schreibt der Testclient die URL des Webservices in die Queue [RP2JQ]
, führt den REST-Call aus und schreibt das Ergebnis in die Queue [J2RPQ]
. Dieses Ergebnis kann dann von einem RPG-Programm empfangen und weiterverarbeitet werden.
Die Integration von RPG-Programmen mit modernen Java-Anwendungen über Dataqueues bietet zahlreiche Möglichkeiten zur Erweiterung und Modernisierung bestehender Anwendungen. Durch die Verwendung von REST-Calls können RPG-Programme nun auf eine breite Palette von Webdiensten zugreifen und deren Funktionalitäten nutzen.
Für weitere Informationen, Sourc-Code und Updates besuchen Sie zeus-access-400 auf GitHub.
Fazit
Durch die Nutzung von Dataqueues als Brücke zwischen RPG und Java eröffnen sich neue Wege zur Integration und Erweiterung von Anwendungen auf System-i, Power Systems oder AS400. Die hier vorgestellte Methode ist nur ein Beispiel für die vielfältigen Möglichkeiten, die sich aus dieser Art der Integration ergeben. Happy Coding!
Alle auf dieser Website genannten Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Alle Firmen-, Produkt- und Dienstleistungsnamen, die in auf diesem Blog verwendet werden, dienen nur zu Identifikationszwecken.