[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Aug 2014
    Beiträge
    181
    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.

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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;

  3. #3
    Registriert seit
    Aug 2014
    Beiträge
    181
    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.

  4. #4
    Registriert seit
    Aug 2014
    Beiträge
    181
    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.

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Das klingt erstmal interessant. Ich gucke mal, was es damit auf sich hat. Vielen Dank!

  6. #6
    Registriert seit
    Aug 2014
    Beiträge
    181
    Heute habe ich redis über das "Open Source Package Management" auf meiner IBM i installiert und es läuft - siehe Screenshots

    Click image for larger version. 

Name:	capture20210416164205566.png 
Views:	20 
Size:	24,5 KB 
ID:	607

    Click image for larger version. 

Name:	capture20210416164537896.png 
Views:	20 
Size:	24,2 KB 
ID:	608

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    OK. Allerdings ist das nicht mein Problem, glaube ich. Unsere Java Kollegen betreiben schon lange einen Redis Server (nicht auf der IBM i). Den muss ich ansprechen!

    Aber trotzdem Danke für deine Mühen!

  8. #8
    Registriert seit
    Apr 2019
    Beiträge
    43
    Man könnte einen schlanken zwischenlayer auf dem redis Server installieren.
    Z.b. ein nodejs Service entwickeln der einfach redis abonniert hat und beim Event reagiert und einen Webservice call auf der IBM i macht. Ggf können dabei direkt alle wichtigen Daten zur IBM i übergeben werden, sodass keine weitere Kommunikation notwendig wird.

    Laut Google kann man den noch redis Server mit einem wrapper modifizieren, dann sind auch Rest calls möglich.
    Das wäre wahrscheinlich der sinnvollste weg.
    Also redis Server registriert selber dass das bestimmte Ereignis eingetreten ist und übergibt die Daten via Webservice call an die ibm i.

  9. #9
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Hallo xenofob,

    danke für deine Idee. Eigentlich bin ich noch auf der Suche nach eine nativen RPG-Lösung. (Kann auch embedded SQL sein.)

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
  •