RabbitMQ服务客户端的的业务逻辑如下:
1,打开 socket:
amqp_new_connection();
amqp_open_socket(hostname, port);
2,用户登陆:
amqp_set_sockfd(conn, sockfd);
amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, userName, password);
3,打开channel
amqp_channel_open(conn, 1);
amqp_get_rpc_reply(conn);
4,声明 Exchange
amqp_exchange_declare(conn, 1, amqp_cstring_bytes(exchange), amqp_cstring_bytes("fanout"),
0, 0, amqp_empty_table);
5,声明Queue
amqp_queue_declare_ok_t *r = amqp_queue_declare(conn, 1, amqp_cstring_bytes(queue), 0, 0, 0, 1,amqp_empty_table);
6,将Queue和Exchange进行binding
amqp_queue_bind(conn, 1,
queuename,
amqp_cstring_bytes(exchange),
amqp_cstring_bytes(bindingkey),
amqp_empty_table);
注意:binding动作在程序中只能执行一次,如果第二次再执行,程序会crash!
7,操作,包括 发送(publish),接收(consume)等。
发送:
amqp_basic_publish(conn,
1,
amqp_cstring_bytes(exchange),
amqp_cstring_bytes(routingkey),
0,
0,
NULL,
amqp_cstring_bytes(messagebody));
接收:
amqp_basic_consume(conn, 1,queuename, amqp_empty_bytes, 0, 1, 0, amqp_empty_table);
amqp_maybe_release_buffers(conn);
此处应该注意:接受的过程是一个阻塞的异步过程,所以必须在子线程中进行操作,这样就不会影响主线程中的UI操作,所以在以前使用的block编程就用了很大的用武之地,一方面,通过block多核编程提高程序的运行效率,第二方面,异步的dispatch能够完美的解决阻塞的问题,并且可以使处理后返回的数据直接在OC类中直接使用,从而规避了在C函数中传递OC的指针来对OC的对象进行的操作,真是一劳永逸的好方法,推荐大家使用。
8,进行unbinding
amqp_queue_unbind(conn, 1,
queuename,
amqp_cstring_bytes(exchange),
amqp_cstring_bytes(bindingkey),
amqp_empty_table);
9,关闭channel
amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);
10,关闭 connection连接。
// Closing connection
amqp_connection_close(conn, AMQP_REPLY_SUCCESS);
//Ending connection
amqp_destroy_connection(conn);