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;