Data Queues bieten eine interessante Möglichkeit Daten asynchron zu verarbeiten. Bisher konnte man sie mit API’s per CL oder RPG ansteuern. In diesem Beitrag zeige ich Ihnen die Verarbeitung mit SQL.
1. Die neuen SQL-Befehle
Quelle: Ross2. Info über die Data Queues auf der IBM i
Mit folgendem SQL-Statement erhalten Sie die Info über die Data Queues auf der Maschine. Darunter ist das Ergebnis.
SELECT DATA_QUEUE_LIBRARY AS "Lib",
DATA_QUEUE_NAME AS "Name",
DATA_QUEUE_TYPE AS "Type",
SEQUENCE,
CURRENT_MESSAGES,
MAXIMUM_MESSAGES,
MAXIMUM_MESSAGE_LENGTH AS "MaxLength"
FROM QSYS2.DATA_QUEUE_INFO;
Quelle: Ross3. Data Queue erstellen mit Daten füllen und Daten lesen mit Hilfe des ACS
Der ACS bietet schöne Möglichkeiten, die Data Queues zu erstellen, zu löschen, mit Daten zu füllen und diese wieder auszulesen.
Wir starten damit, eine bestehende Data Queue zu löschen, bevor eine neue erstellt wird. Um CL-Befehle im ACS auszuführen beginnen sie mit „cl:“ und sie können auch mit F4 die Parameter promten.
cl:DLTDTAQ DTAQ(TSTO/SNDMSGQ)
Jetzt erstellen wir die Data Queue neu:
cl:CRTDTAQ DTAQ(TSTO/SNDMSGQ) MAXLEN(500) SEQ(*FIFO)
SIZE(*MAX2GB) AUTORCL(*YES)
TEXT('Dataqueue für SendMessages') AUT(*USE)
und senden Daten an die Data Queue. Das können Sie auf zwei Arten tun:
- mit Spezifikation der Parameter:
CALL QSYS2.SEND_DATA_QUEUE(
DATA_QUEUE_LIBRARY => 'TSTO',
DATA_QUEUE => 'SNDMSGQ',
MESSAGE_DATA => 'Nachricht für die DataQueue'
);
- oder ohne Spezifikation der Parameter:
CALL QSYS2.SEND_DATA_QUEUE('Nachricht für die DataQueue', 'SNDMSGQ', 'TSTO'
Aus Gründen der leichteren Wartbarkeit und besseren Lesbarkeit der Programme empfehle ich, die Parameter zu spezifizieren.
Nach Ausführung des Sendens schauen wir uns jetzt die Data Queue mit DATA_QUEUE_INFO an
SELECT DATA_QUEUE_LIBRARY AS "Lib",
DATA_QUEUE_NAME AS "Name",
DATA_QUEUE_TYPE AS "Type",
SEQUENCE,
CURRENT_MESSAGES,
MAXIMUM_MESSAGES,
MAXIMUM_MESSAGE_LENGTH AS "MaxLength"
FROM QSYS2.DATA_QUEUE_INFO
WHERE DATA_QUEUE_LIBRARY = 'TSTO'
AND DATA_QUEUE_NAME = 'SNDMSGQ';
Hier das Ergebnis:
Quelle: RossJetzt fehlt nur noch das SQL-Statement, um den Datensatz in der Data Queue zu lesen.
select Message_Data from table(
QSYS2.RECEIVE_DATA_QUEUE(
DATA_QUEUE_LIBRARY => 'TSTO',
DATA_QUEUE => 'SNDMSGQ',
REMOVE => 'NO'
)
);
das liefert folgendes Ergebnis:
Quelle: RossWenn Sie UTF8-Daten in die Data Queue schreiben wollen, dann geht das mit folgendem Statement:
CALL QSYS2.SEND_DATA_QUEUE_UTF8(
DATA_QUEUE_LIBRARY => 'TSTO',
DATA_QUEUE => 'SNDMSGQ',
MESSAGE_DATA => 'Nachricht von Sacré-Cœur'
);
Die UTF8-Daten befinden sich in diesem Fall nicht im Feld MESSAGE_DATA, sondern im Feld:
MESSAGE_DATA_UTF8.
Quelle: RossFalls Sie mit Webservices arbeiten und Daten im JSON-Format benötigen, können Sie auch beides miteinander verbinden, z.B. für das Versenden einer SMS, wie ich es in einem früheren Artikel beschrieben habe.
CALL QSYS2.SEND_DATA_QUEUE_UTF8(
DATA_QUEUE_LIBRARY => 'TSTO',
DATA_QUEUE => 'SNDMSGQ',
MESSAGE_DATA => JSON_OBJECT(
'from' value '+123456789',
'to' value '+123456789',
'body' value 'Hello World aus Sacré-Cœur'
)
);
Das Ergebnis sieht so aus:
Quelle: RossDas Löschen des Inhalts der Data Queue geht sehr einfach mit diesem Statement:
CALL QSYS2.CLEAR_DATA_QUEUE(
DATA_QUEUE_LIBRARY => 'TSTO',
DATA_QUEUE => 'SNDMSGQ'
);
4. Data Queue mit SQL und einem RPG-Programm füllen.
Wenn Sie das bisher mit den API’s gemacht haben, dann sehen Sie jetzt, dass Sie mit viel weniger Statements auskommen.
ctl-opt dftactgrp(*no) main(main);
//------------------------------------------------------------------//
// //
// Daten an Data Queue senden //
// //
//----------------- //
// R.Ross 12.2023 * //
//------------------------------------------------------------------//
// Main //
//------------------------------------------------------------------//
dcl-proc main;
dcl-s LocLib char(10) inz('TSTO');
dcl-s LocObj char(10) inz('SNDMSGQ');
dcl-s LocData char(50);
exec sql // DataQueue löschen
CALL QSYS2.CLEAR_DATA_QUEUE(
DATA_QUEUE_LIBRARY => :LocLib,
DATA_QUEUE => :LocObj
);
LocData = 'Nachricht für die DataQueue';
exec sql // Daten senden
CALL QSYS2.SEND_DATA_QUEUE(
DATA_QUEUE_LIBRARY => :LocLib,
DATA_QUEUE => :LocObj,
MESSAGE_DATA => :LocData
);
end-proc;
//------------------------------------------------------------------//
Viel Spaß beim Ausprobieren.
Den Autor Rainer Ross erreichen Sie unter:
Rainer Ross IT-Beratung, Bgm.-Hollweck-Str. 6, 85599 Parsdorf
Ausgezeichnet mit dem Innovationspreis der IBM und Spezialist für Webservices und Webanwendungen auf IBM i so schnell wie Greenscreen, Beispiel: www.myhofi.com/myapps/HTML/Myapp.html
Tel. (+49) 151/684 375 53 oder 089/413 252 94,
E-Mail: rainer_ross@web.de
Web: www.myhofi.com – Hotels finden – leicht gemacht
