[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2

Hybrid View

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

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

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
  •