Qpid Proton客户端使用引擎API不向服务器发送消息

时间:2016-02-24 01:56:17

标签: c amqp qpid

我正在尝试使用C中的Qpid Proton编写AMQP 1.0客户端。我不想使用messenger。我想使用质子c引擎。我在弄清楚如何做到这一点时遇到了一些麻烦。我的主要关键点是为连接设置端点。使用我能找到的质子c引擎的C客户端的唯一例子就在这里。

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

但是,它使用的结构不属于Qpid Proton C API 0.12.0。具体来说,我没有看到pn_driver_t或pn_connector_t作为0.12.0 API的一部分。

我正在尝试遵循AMQP 1.0规范中定义的一般工作流程1)创建连接,2)创建会话,3)创建发件人链接。我对C不太熟悉,这是我第一次使用Qpid Proton库的非信使部分,如果我错过了一些明显的东西,请原谅我。这是我目前的代码。我一直在尝试不同的选择并寻找好几天。

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

在我的AMQP服务器上,我启用了帧级别跟踪,但没有看到来自客户端的任何通信。这不是服务器的问题。它适用于许多其他客户端,包括使用messenger API的C客户端。我在这个样本中缺少什么?谢谢!

注意:我试图详尽地解决这个问题并提供尽可能多的上下文。

1 个答案:

答案 0 :(得分:1)

驱动程序API已于2015年3月在Apache Qpid Proton版本0.9中删除。

  

提交4b53bfca06432e440c95d60648b5e7be54ae4296   作者:Rafael Schloming   日期:星期五2月13日08:27:23 2015 -0500

removed driver API and bindings

Proton中的C代码示例是基于Messenger的。

许多最近的工作已经进入基于反应堆的C ++实现,而不是基于Messenger。有关详细信息和示例,请参阅release 0.12.1 documentation