2016-02-24 25 views
5

Sto provando a scrivere un client AMQP 1.0 utilizzando Qpid Proton in C. Non voglio usare messenger. Voglio usare il motore del protone. Sto avendo un piccolo problema a capire come farlo. Il mio principale punto di attacco è l'impostazione dell'endpoint per la connessione. L'unico esempio di un client C che utilizza il motore protone-c che posso trovare è qui.Qpid Proton client che utilizza l'API del motore non invia messaggi al server

https://github.com/apache/qpid-proton/blob/master/examples/engine/c/psend.c

Tuttavia, usa le strutture che non fanno parte del Qpid Proton C API 0.12.0. Nello specifico, non vedo pn_driver_t o pn_connector_t come parte dell'API 0.12.0.

Sto cercando di seguire il flusso di lavoro generale definito nella specifica AMQP 1.0 1) creare una connessione, 2) creare una sessione, 3) creare un collegamento mittente. Non ho molta esperienza con C e questa è la mia prima volta che uso la parte non-messenger della libreria Qpid Proton, quindi perdonami se ho perso qualcosa di ovvio. Ecco il mio codice attuale. Ho provato diverse opzioni e cercato per giorni.

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include "proton/message.h" 
#include "proton/messenger.h" 
#include "proton/connection.h" 
#include "proton/session.h" 
#include "proton/link.h" 
#include "proton/delivery.h" 
#include "proton/event.h" 
#include "proton/engine.h" 

//State integer values are defined in Connection macros 
//https://qpid.apache.org/releases/qpid-proton-0.12.0/proton/c/api/group__connection.html 
void print_state(char * name, pn_state_t state) 
{ 
    printf("[%s] local: %i, remote: %i\n", name, PN_LOCAL_MASK & state, PN_REMOTE_MASK & state); 
} 

//Reference https://github.com/apache/qpid-proton/blob/master/examples/engine/c/psend.c 
void send_engine() 
{ 
    struct pn_connection_t * connection; 
    connection = pn_connection(); 
    //STACKOVERFLOW - I have a feeling this is not right, but cannot find an alternative to set protocol (amqp or ws) the hostname and port. I see a way to set the hostname only 
    pn_connection_set_container(connection, "amqp://amqpserver:port"); 
    print_state("Connection Initialized", pn_connection_state(connection)); 

    pn_transport_t * transport; 
    transport = pn_transport(); 
    int r = pn_transport_bind(transport, connection); 
    if (r != 0) 
    { 
     printf("transport bind error: %i\n", r); 
    } 

    pn_connection_open(connection); 
    print_state("Connection Opened", pn_connection_state(connection)); 

    pn_session_t * sess; 
    sess = pn_session(connection); 
    print_state("Session Initialized", pn_session_state(sess)); 

    pn_session_open(sess); 
    print_state("Session Opened", pn_session_state(sess)); 

    pn_link_t * sender; 
    sender = pn_sender(sess, "c-client"); 
    //the queue name in "toserver" 
    pn_terminus_set_address(pn_link_target(sender), "toserver"); 
    print_state("Sender Link Initialized", pn_link_state(sender)); 

    pn_link_open(sender); 
    print_state("Sender Link Opened", pn_link_state(sender)); 

    pn_delivery_t *delivery; 
    char *tagID = "uid"; 
    delivery = pn_delivery(sender, pn_dtag(tagID, strlen(tagID))); 

    char *msg = "abc"; 
    printf("%zd\n", pn_link_send(sender, msg, strlen(msg))); 
    pn_delivery_settle(delivery); 
    printf("Delivery stettled %d\n", pn_delivery_settled(delivery)); 

    print_state("Connection End", pn_connection_state(connection)); 
    print_state("Session End", pn_session_state(sess)); 
    print_state("Sender Link End", pn_link_state(sender)); 

    //TODO free everything 
} 

int main (int argc, char *argv[]) 
{ 
    send_engine(); 
    printf("done\n"); 
    return 0; 
} 

Sul mio server AMQP ho abilitato il tracciamento a livello di frame e non vedo alcuna comunicazione dal client. Questo non è un problema con il server. Funziona con molti altri client, incluso un client C che utilizza l'API di messenger. Cosa mi manca in questo campione? Grazie!

Nota: ho cercato di risolverlo in modo esaustivo e di fornire il contesto il più possibile.

risposta

1

L'API driver è stato rimosso nel Apache Qpid Proton rilasciare 0,9 in marzo, 2015.

commettere 4b53bfca06432e440c95d60648b5e7be54ae4296 Autore: Rafael Schloming Data: Fri 13 Feb 2015 08:27:23 -0500

removed driver API and bindings 

Gli esempi di codice C in Proton sono basati su Messenger.

Un sacco di lavoro recente è andato in un'implementazione C++ basata su reattori che non è basata su Messenger. Vedi release 0.12.1 documentation per ulteriori dettagli ed esempi.