2016-02-24 26 views
5

Tôi đang cố gắng viết một ứng dụng AMQP 1.0 bằng cách sử dụng Qpid Proton trong C. Tôi không muốn sử dụng messenger. Tôi muốn sử dụng động cơ proton-c. Tôi gặp một chút rắc rối khi tìm ra cách để làm điều này. Điểm gắn bó chính của tôi là thiết lập điểm cuối cho kết nối. Ví dụ duy nhất của một khách hàng C sử dụng động cơ proton-c tôi có thể tìm thấy ở đây.Khách hàng Qpid Proton sử dụng API động cơ không gửi tin nhắn tới máy chủ

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

Tuy nhiên, nó sử dụng cấu trúc mà không phải là một phần của API Qpid Proton C 0.12.0. Cụ thể, tôi không thấy pn_driver_t hoặc pn_connector_t như một phần của API 0.12.0.

Tôi đang cố gắng làm theo quy trình công việc chung được xác định trong thông số AMQP 1.0 1) tạo kết nối, 2) tạo phiên, 3) tạo liên kết người gửi. Tôi không có kinh nghiệm với C và đây là lần đầu tiên tôi sử dụng phần không phải là sứ giả của thư viện Qpid Proton để tha thứ cho tôi nếu tôi bỏ lỡ một điều gì đó hiển nhiên. Đây là mã hiện tại của tôi. Tôi đã thử các tùy chọn khác nhau và tìm kiếm ngày.

#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; 
} 

Trên máy chủ AMQP của tôi Tôi đã bật theo dõi cấp khung và không thấy bất kỳ liên lạc nào từ khách hàng. Đây không phải là vấn đề với máy chủ. Nó hoạt động với nhiều máy khách khác, bao gồm một máy khách C sử dụng API messenger. Tôi đang thiếu gì trong mẫu này? Cảm ơn bạn!

Lưu ý: Tôi đã cố gắng giải quyết triệt để và cung cấp càng nhiều ngữ cảnh càng tốt.

Trả lời

1

Người lái xe API đã được gỡ bỏ trong Apache Qpid Proton phát hành 0,9 tháng ba năm 2015.

cam 4b53bfca06432e440c95d60648b5e7be54ae4296 Tác giả: Rafael Schloming ngày: Fri 13 Tháng Hai 2015 08:27:23 -0500

removed driver API and bindings 

Ví dụ mã C trong Proton là dựa trên Messenger.

Rất nhiều công việc gần đây đã đi vào thực hiện C++ dựa trên lò phản ứng không phải dựa trên Messenger. Xem release 0.12.1 documentation để biết thêm chi tiết và ví dụ.

Các vấn đề liên quan