我正在尝试使用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客户端。我在这个样本中缺少什么?谢谢!
注意:我试图详尽地解决这个问题并提供尽可能多的上下文。
答案 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。