[NEWSboard IBMi Forum]
Seite 2 von 3 Erste 1 2 3 Letzte
  1. #13
    Registriert seit
    Aug 2014
    Beiträge
    179
    Hallo Dieter,

    ich hatte mal die Aufgabe die Cloud Datenbank "Cloudant" der IBM anzuprogrammieren. Hier werden für alle Datenbankfunktionen Webservices zur Verfügung gestellt. Ich denke, dass es für Redis ähnlich sein sollte.

    Diese Funktionen teste ich mit Google Postman und implementiere sie dann mit den SQL-Funktionen HTTPGETCLOB oder HTTPPOSTCLOB. Das funktioniert sehr gut und ist sehr performant.

    Rainer

  2. #14
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Rainer Ross Beitrag anzeigen
    Hallo Dieter,

    ich hatte mal die Aufgabe die Cloud Datenbank "Cloudant" der IBM anzuprogrammieren. Hier werden für alle Datenbankfunktionen Webservices zur Verfügung gestellt. Ich denke, dass es für Redis ähnlich sein sollte.

    Diese Funktionen teste ich mit Google Postman und implementiere sie dann mit den SQL-Funktionen HTTPGETCLOB oder HTTPPOSTCLOB. Das funktioniert sehr gut und ist sehr performant.

    Rainer
    ... das mit der Performance wage ich zu bezweifeln (oder ich habe eine andere Vorstellung von sehr performant). Die Implementierung ist Java und fährt eine JVM im aufrufenden Job hoch. Funktioniert sehr gut: nur solange, wie man in dem Job nicht selber was mit Java machen will. Das sind doch mit heißer Nadel gestrickte Krücken, von denen ich abraten würde.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #15
    Registriert seit
    Nov 2020
    Beiträge
    327
    Bei zeitkritischen Prozessen sollte man hier den Weg über vorgestartete Jobs die via Data Queue angesteuert werden nachdenken.
    Dann fällt das Problem mit der gestarteten JVM weg, da dies dann nur 1 mal für den vorgestarteten Job gemacht wird.
    Funktioniert prima.
    Auch synchron wenn gewünscht mit Rückantwort.

  4. #16
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... redis ist eine Art cache von Parametern, eingesetzt als schnellere Alternative zur Datenbank; da würde ich die Anzahl der Layer klein halten, da wäre mir Webservice via Java und SQL schon fragwürdig.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #17
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Ich habe auch gelesen, dass Redis als Cache Unterstützung verwendet werden kann. Bei uns haben wir aber einen anderen Einsatzzweck: Wir nutzen Redis als Message System für Events. Wenn z.B. in einer (nicht auf der i laufenden) Java Anwendung ein neuer Datensatz angelegt wird, sendet die Java Anwendung per Redis ein entsprechendes Ereignis. Jede andere Anwendung, die sich auf genau dieses Ereignis abonniert hat, weiß dann, das es neue Daten gibt und dass diese (per Webservice) vom anderen System geholt werden können.
    Das heißt, Geschwindigkeit ist gar nicht so entscheidend in unserem Fall.

  6. #18
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo Rainer. Ich habe bei einem Java Kollegen mal gefragt, ob Redis auch ein Webservice Provider ist. Er meinte, dass es das für Ereignisse nicht gibt (oder er hielt es für eine schlechte Lösung, da bin ich mir nicht so sicher).
    Was wir letztlich brauchen, ist ein Listener, der den Redis Server abhört und reagiert, sobald ein interessantes Ereignis auftaucht. Mit einem Webservice erscheint mir das gefühlt etwas ressourcenkritisch. Ich müsste den Webservice ja 1 mal pro Sekunde aufrufen oder so.

    Vielleicht gibt es aber auch einen "Listener-Webservice", der ressourcenschonend solange wartet, bis ein Ereignis geliefert wird.

    Ich habe eine IBM Website gefunden (https://www.ibm.com/de-de/cloud/databases-for-redis), in der von Redis und Cloud Databases gesprochen wird. Da steht unter "zugehörige Produkte" IBM-Cloudant und IBM Cloud Databases for PostgreSQL. Ich verstehe da den Zusammenhang nicht: Muss ich erst eine IBM Cloudlösung mieten, damit ich die Redis Zugriffsfunktionen nutzen kann?

  7. #19
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von dschroeder Beitrag anzeigen
    Ich habe auch gelesen, dass Redis als Cache Unterstützung verwendet werden kann. Bei uns haben wir aber einen anderen Einsatzzweck: Wir nutzen Redis als Message System für Events. Wenn z.B. in einer (nicht auf der i laufenden) Java Anwendung ein neuer Datensatz angelegt wird, sendet die Java Anwendung per Redis ein entsprechendes Ereignis. Jede andere Anwendung, die sich auf genau dieses Ereignis abonniert hat, weiß dann, das es neue Daten gibt und dass diese (per Webservice) vom anderen System geholt werden können.
    Das heißt, Geschwindigkeit ist gar nicht so entscheidend in unserem Fall.
    ... seltsames Design, wer lässt sich denn sowas einfallen, wo es doch messanger systeme genug gibt, open source und auch von IBM, wenn man mehr Geld für weniger Support bezahlen will. Wie auch immer, gibt es immer Lösungen, die krumme Wege wieder zum Ziel leiten.
    Vielleicht findest Du ja hier was:
    https://stackoverflow.com/questions/...edis-datastore
    Weiterreichen kann man das event dann über MQ-series, einen anderen messanger oder in eine DB2 Tabelle auf der as400 schreiben, die dann per Trigger synchron reagiert.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #20
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Vielen Dank. Werde ich mir mal ansehen.

  9. #21
    Registriert seit
    Aug 2014
    Beiträge
    179
    Zitat Zitat von dschroeder Beitrag anzeigen
    Ich habe auch gelesen, dass Redis als Cache Unterstützung verwendet werden kann. Bei uns haben wir aber einen anderen Einsatzzweck: Wir nutzen Redis als Message System für Events. Wenn z.B. in einer (nicht auf der i laufenden) Java Anwendung ein neuer Datensatz angelegt wird, sendet die Java Anwendung per Redis ein entsprechendes Ereignis. Jede andere Anwendung, die sich auf genau dieses Ereignis abonniert hat, weiß dann, das es neue Daten gibt und dass diese (per Webservice) vom anderen System geholt werden können.
    Das heißt, Geschwindigkeit ist gar nicht so entscheidend in unserem Fall.
    In diesem Fall sieht es so aus, dass es einen fertigen Node.js Client gibt https://www.npmjs.com/package/redis der das Event abonniert. Diese Events schreibt man dann in eine DTAQ oder in eine DB2 Tabelle mit Trigger für die weitere Verarbeitung. Auf https://github.com/RainerRoss/Send-S...taFromQueue.js hab ich ein Beispiel für ein Programm das Daten aus einer DTAQ liest, um zu zeigen, dass es nicht sehr kompliziert ist. Wir können auch über das Thema telefonieren.

  10. #22
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo Rainer,
    danke für deine Antwort. Du hast richtig erkannt, dass ich mich auf dem Redis für ein Event abonnieren möchte. Für die meisten gängigen Programmiersprachen (Java, Node.js, ...) gibt es dafür bereits fertige Clients. Ich würde das aber gerne direkt im RPG machen. Du kennst ja den Node.js Code. Bist du der Meinung, dass man das Abonnieren auch im RPG nachbauen kann? Das Schreiben eines Events haben wir ja bereits vor Jahren in RPG gebaut. Ich fürchte, dass das Abonnieren aber komplizierter ist, oder?

    Hier mal unser Schreibprogramm für Redis. ist nicht sehr lang, finde ich. Wenn man so etwas für's Lesen hinbekäme, wäre ich am Ziel. Wenn nicht, werden wir es wahrscheinlich mit in RPG eingebettetem Java realisieren.
    Code:
          *============================================================================================*      * Programm-Aufgabe  Event an Redis Server schicken                                           *
          * Generierung       27.08.2013                                                               *
          * Programmierer     HIN                                                                      *
          *============================================================================================*
         D/COPY LIBHTTP/QRPGLESRC,socket_h
          *
          *=========================================================================
         D translate       PR                  ExtPgm('QDCXLATE')
         D   Length                       5P 0 const
         D   Data                     32766A   options(*varsize)
         D   Table                       10A   const
          *
          *=========================================================================
         D ecc_ip_addr     S             10U 0
         D ecc_socket      S             10I 0
         D ecc_connection  S             10I 0
         D ecc_sockaddr    DS                  LIKEDS(sockaddr_in)
          *
         D ecc_cmd         S           1000A
         D ecc_len         S             10I 0
          *
         D ecc_temp        S            100A
         D ecc_response    S            100A   varying
          *
         D CRLF            C                   x'0d25'
         D KlammerAuf      C                   x'c0'
         D KlammerZu       C                   x'd0'
          *=========================================================================
          * Main
          *=========================================================================
         C     *ENTRY        PLIST
         C                   PARM                    P#SCode           3            Steuercode
         C                   PARM                    host            100
         C                   PARM                    port              5 0
         C                   PARM                    topic           100
         C                   PARM                    data           1000
         C                   PARM                    response          5 0
         C                   PARM                    errMsg          100
    
    
            ecc_ip_addr = inet_addr(%trim(host));
    
    
            if (ecc_ip_addr = INADDR_NONE);
              p_hostent = gethostbyname(%trim(host));
                if (p_hostent = *null);
                  errMsg = 'Host not found!';
                else;
                  ecc_ip_addr = h_addr;
                endif;
            endif;
    
    
            ecc_socket = socket(AF_INET:SOCK_STREAM:IPPROTO_IP);
            if (ecc_socket = -1);
              errMsg = 'Error has occurred during create socket';
            endif;
    
    
            ecc_sockaddr = *allx'00';
            ecc_sockaddr.sin_family = AF_INET;     // Type of address
            ecc_sockaddr.sin_addr = ecc_ip_addr;   // IP adress
            ecc_sockaddr.sin_port = port;          // port number
    
    
            ecc_connection = connect(ecc_socket
                                     :%addr(ecc_sockaddr)
                                     :%size(ecc_sockaddr));
    
    
            if (ecc_connection = -1);
              errMsg = 'Error has occurred during connect';
            endif;
    
    
            ecc_cmd = '*3' + CRLF
                    + '$7' + CRLF + 'PUBLISH' + CRLF
                    + '$' + %char(%len(%trim(topic))) + CRLF + %trim(topic) + CRLF
                    + '$' + %char(%len(%trim(data ))) + CRLF + %trim(data ) + CRLF;
    
    
            callp translate(%len(%trimr(ecc_cmd)):ecc_cmd:'QTCPASC');
    
    
            ecc_len = send(ecc_socket
                           :%addr(ecc_cmd)
                           :%len(%trimr(ecc_cmd))
                           : 0);
    
    
            if (ecc_len < %len(%trimr(ecc_cmd)));
              errMsg = 'Error during send.';
            endif;
    
    
            ecc_len = recv(ecc_socket:%addr(ecc_temp):%size(ecc_temp):0);
            if (ecc_len = -1);
               errMsg = 'Error during recv.';
            else;
               ecc_response = %subst(ecc_temp:1:ecc_len);
    
    
               ecc_len = %len(ecc_response);
               ecc_temp = ecc_response;
               callp translate(ecc_len:ecc_temp:'QTCPEBC');
               ecc_response = %subst(ecc_temp:2:ecc_len - 3);
    
    
               response = %dec(ecc_response:5:0);
            endif;
    
    
            callp close(ecc_socket);
    
    
            return;

  11. #23
    Registriert seit
    Aug 2014
    Beiträge
    179
    Zitat Zitat von dschroeder Beitrag anzeigen
    Hallo Rainer,
    danke für deine Antwort. Du hast richtig erkannt, dass ich mich auf dem Redis für ein Event abonnieren möchte. Für die meisten gängigen Programmiersprachen (Java, Node.js, ...) gibt es dafür bereits fertige Clients. Ich würde das aber gerne direkt im RPG machen. Du kennst ja den Node.js Code. Bist du der Meinung, dass man das Abonnieren auch im RPG nachbauen kann? Das Schreiben eines Events haben wir ja bereits vor Jahren in RPG gebaut. Ich fürchte, dass das Abonnieren aber komplizierter ist, oder?

    Hier mal unser Schreibprogramm für Redis. ist nicht sehr lang, finde ich. Wenn man so etwas für's Lesen hinbekäme, wäre ich am Ziel. Wenn nicht, werden wir es wahrscheinlich mit in RPG eingebettetem Java realisieren.
    Hallo Dieter,
    die Kommunikation mit Redis geht auch bei Node.js über Sockets. Das müsste auch im RPG machbar sein. Das Abonnieren eines Events sollte auch nicht komplizierter sein. Das RPG-Programm ist eine gute Basis dafür.

    In Node.js geht, dass es im Programm asynchrone Funktionen gibt, die auf die abonnierten Events lauschen. Da bin ich mir nicht sicher, ob man es mit RPG nachbauen kann.

  12. #24
    Registriert seit
    Aug 2014
    Beiträge
    179
    ich habe gerade gesehen, dass redis auch über das "Open Source Package Management" auf der IBM i zur Verfügung steht. Im Moment habe ich gerade leider keine Zeit es auszuprobieren, aber ich finde es sehr interessant, es zu testen.

Similar Threads

  1. Zugriff auf IFS getrennt
    By RPG_KL in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 30-07-20, 19:04
  2. Qdls zugriff unter Win7 zugriff verweigert
    By berg01796 in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 15-11-16, 11:55
  3. AS400-Zugriff
    By Der Gute in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 01-07-02, 11:11
  4. ODBC Zugriff auf DB2 mit VBA
    By Bärnd in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 29-05-02, 15:58
  5. FTP - Zugriff
    By Andreas Herzfeldt in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 02-07-01, 06:51

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •