rabbitmq-c是一个用于C语言的,与AMQP server进行交互的client库,AMQP协议为版本0-9-1。rabbitmq-c与server进行交互前须要首先进行login操做,在操做后,能够根据AMQP协议规范,执行一系列操做。html
这里,根据项目需求,只进行部分接口说明,文后附demo的github地址。python
接口描述:git
amqp_connection_state_t amqp_new_connection(void);github
接口说明:声明一个新的amqp connectionsocket
int amqp_open_socket(char const *hostname, int portnumber);fetch
接口说明:获取socket.ui
参数说明:hostname RabbitMQ server所在主机code
portnumber RabbitMQ server监听端口 server
void amqp_set_sockfd(amqp_connection_state_t state,int sockfd);htm
接口说明:将amqp connection和sockfd进行绑定
amqp_rpc_reply_t amqp_login(amqp_connection_state_t state, char const *vhost,int channel_max,int frame_max,int heartbeat,amqp_sasl_method_enum sasl_method, ...);
接口说明:用于登陆RabbitMQ server,主要目的为了进行权限管理;
参数说明:state amqp connection
vhost rabbit-mq的虚机主机,是rabbit-mq进行权限管理的最小单位
channel_max 最大连接数,此处设成0便可
frame_max 和客户端通讯时所容许的最大的frame size.默认值为131072,增大这个值有助于提升吞吐,下降这个值有利于下降时延
heartbeat 含义未知,默认值填0
sasl_method 用于SSL鉴权,默认值参考后文demo
amqp_channel_open_ok_t *amqp_channel_open(amqp_connection_state_t state, amqp_channel_t channel);
接口说明:用于关联conn和channel
amqp_exchange_declare_ok_t *amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t exchange, amqp_bytes_t type, amqp_boolean_t passive, amqp_boolean_t durable, amqp_table_t arguments);
接口说明:声明declare
参数说明:state
channel
exchange
type "fanout" "direct" "topic"三选一
passive
curable
arguments
amqp_queue_declare_ok_t *amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_boolean_t auto_delete, amqp_table_t arguments);
接口说明:声明queue
参数说明:state amqp connection
channel
queue queue name
passive
durable 队列是否持久化
exclusive 当前链接不在时,队列是否自动删除
aoto_delete 没有consumer时,队列是否自动删除
arguments 用于拓展参数,好比x-ha-policy用于mirrored queue
amqp_queue_bind_ok_t *amqp_queue_bind(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t exchange, amqp_bytes_t routing_key, amqp_tab le_t arguments);
接口说明:声明binding
amqp_basic_qos_ok_t *amqp_basic_qos(amqp_connection_state_t state, amqp_channel_t channel, uint32_t prefetch_size, uint16_t prefetch_count, amqp_boolean_t global);
接口说明:qos是 quality of service,咱们这里使用主要用于控制预取消息数,避免消息按条数均匀分配,须要和no_ack配合使用
参数说明:state
channel
prefetch_size 以bytes为单位,0为unlimited
prefetch_count 预取的消息条数
global
amqp_basic_consume_ok_t *amqp_basic_consume(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_bytes_t consumer_tag, amqp_boolean_t no_local, amqp_boolean_t no_ack, amqp_boolean_t exclusive, amqp_table_t arguments);
接口说明:开始一个queue consumer
参数说明:state
channel
queue
consumer_tag
no_local
no_ack 是否须要确认消息后再从队列中删除消息
exclusive
arguments
int amqp_basic_ack(amqp_connection_state_t state,amqp_channel_t channel,uint64_t delivery_tag,amqp_boolean_t multiple);
int amqp_basic_publish(amqp_connection_state_t state,amqp_channel_t channel,amqp_bytes_t exchange,amqp_bytes_t routing_key,amqp_boolean_t mandatory,amqp_boolean_t immediate,struct amqp_basic_properties_t_ const *properties,amqp_bytes_t body);
接口说明:发布消息
参数说明:state
channel
exchange
routing_key 当exchange为默认“”时,此处填写queue_name,当exchange为direct,此处为binding_key
mandatory 参见参考文献2
immediate 同上
properties 更多属性,如何设置消息持久化,参见文后demo
body 消息体
amqp_rpc_reply_t amqp_channel_close(amqp_connection_state_t state,amqp_channel_t channel,int code);
amqp_rpc_reply_t amqp_connection_close(amqp_connection_state_t state,int code);
int amqp_destroy_connection(amqp_connection_state_t state);
如何consume消息,参见文后demo。
https://github.com/liuhaobupt/rabbitmq_work_queues_demo-with-rabbit-c-client-lib
其中 rmq_new_task.c和rmq_worker.c对应于RabbitMQ tutorial里的work queues章节(http://www.rabbitmq.com/tutorials/tutorial-two-python.html),emit_log_direct.c和receive_logs_direct.c对应于RabbitMQ tutorial里的routing章节(http://www.rabbitmq.com/tutorials/tutorial-four-python.html),这两个demo覆盖了RabbitMQ的经常使用应用场景。
编译须要librabbitmq.a库,同时须要rabbitmq-c提供的几个头文件(amqp.h和amqp_framing.h)以及utils.c文件,这些在github project页面都可得到。