我正在尝试使用C中的Qpid Proton编写AMQP 1.0客户端。我不想使用信使。我想使用质子-c引擎。我在弄清楚如何做到这一点时遇到了一点麻烦。我的主要症结是设置连接的endpoint。我能找到的使用质子-c引擎的C客户端的唯一示例在这里。
https://github.com/apache/qpid-proton/blob/master/examples/engine/c/psend.c
但是,它使用的结构不是Qpid质子CAPI0.12.0的一部分。具体来说,我不认为pn_driver_t或pn_connector_t是0.12.0API的一部分。
我正在尝试遵循AMQP 1.0规范中定义的一般工作流程1)创建连接,2)创建会话,3)创建发件人链接。我对C不是很有经验,这是我第一次使用Qpid质子库的非信使部分,所以如果我错过了一些明显的东西,请原谅我。这是我目前的代码。我一直在尝试不同的选项并搜索了好几天。
#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服务器上,我启用了帧级跟踪,看不到来自客户端的任何通信。这不是服务器的问题。它适用于许多其他客户端,包括使用信使API的C客户端。我在这个示例中缺少什么?谢谢!
注意:我试图详尽地解决这个问题,并提供尽可能多的上下文。
驱动程序API在2015年3月的Apache Qpid Proton 0.9版中被删除。
提交4b53bfca06432e440c95d60648b5e7be54ae4296作者: Rafael Schlaming日期:Fri Feb 13 08:27:23 2015-0500
removed driver API and bindings
Proton中的C代码示例基于Messenger。
最近的许多工作都涉及到基于反应器的C实现,而不是基于Messenger。有关更多详细信息和示例,请参阅0.12.1版留档。