Rabbitmq使用必须理解的一些概念
(转自:http://www.linuxidc.com/Linux/2013-11/92591.htm)
channel:通道,amqp支持一个tcp连接上启用多个mq通信通道,每个通道都可以被作为通信流。
producer:生产者,是消息产生的源头。
exchange:交换机,可以理解为具有路由表的路由规则。
queues:队列,装载消息的缓存容器。
consumer:消费者,连接到队列并取走消息的客户端。
核心思想:在RabbitMQ中,生产者从不直接将消息发送给队列。
事实上,有些生产者甚至不知道消息是否被送到某个队列中去了。生产者只负责将消息送给交换机,而交换机确切地知道什么消息应该送到哪。
bind:绑定,实际上可以理解为交换机的路由规则。每个消息都有一个称为路由键的属性(routing key),就是一个简单的字符串。一个绑定将【交换机,路由键,消息送达队列】三者绑定在一起,形成一条路由规则。
exchange type:交换机类型:
fanout:不处理路由键,转发到所有绑定的队列上
direct:处理路由键,必须完全匹配,即路由键字符串相同才会转发
topic:路由键模式匹配,此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”
创建或者声明一个exchange
/**
* amqp_exchange_declare
*
* @param [in] connect连接 amqp_new_connection获取
* @param [in] channel the channel to do the RPC on,程序自己设置一个通道号,一个连接可以多个通道号。
* @param [in] exchange 指定exchange名称 eg:amqp_cstring_bytes("exchange_cat")
* @param [in] type 指定exchange类型,amqp_cstring_bytes("direct")
* "fanout" 广播的方式,发送到该exchange的所有队列上。
* "direct" 通过路由键发送到指定的队列上。
* "topic" 通过匹配路由键的方式获取,使用通配符*,#
* @param [in] passive 检测exchange是否存在,设为true,若队列存在则命令成功返回(调用其他参数不会影响exchange属性),若不存在不会创建exchange,返回错误。设为false,如果exchange不存在则创建exchange,调用成功返回。如果exchange已经存在,并且匹配现在exchange的话则成功返回,如果不匹配则exchange声明失败。
* @param [in] durable 队列是否持久化
* @param [in] auto_delete 连接断开的时候,exchange是否自动删除
* @param [in] internal internal
* @param [in] arguments arguments
* @returns amqp_exchange_declare_ok_t
*/
AMQP_PUBLIC_FUNCTION
amqp_exchange_declare_ok_t *
AMQP_CALL 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_boolean_t auto_delete, amqp_boolean_t internal, amqp_table_t arguments);
调用函数之后,使用amqp_get_rpc_reply(conn)来获取调用结果。
amqp_exchange_declare(conn, 1, amqp_cstring_bytes("exchange_cat"), amqp_cstring_bytes("direct"), 1, 1, 0,0, amqp_empty_table);
die_on_amqp_error(amqp_get_rpc_reply(conn), "Declaring exchange");
注意事项
amqp_exchange_declare函数中的参数passive设置为0,会出现在声明exchange之后,声明队列amqp_queue_declare处于死循环的问题
amqp_exchange_declare(m_connState, 1, amqp_cstring_bytes(strExchange.c_str()), amqp_cstring_bytes("fanout"), 0, 1, 0, 0, amqp_empty_table);
amqp_queue_declare(m_connState, 1, amqp_cstring_bytes(strQueue.c_str()), 0, 0, 0, 1, amqp_empty_table);
amqp_queue_bind(m_connState, 1, amqp_cstring_bytes(strQueue.c_str()), amqp_cstring_bytes(strExchange.c_str()), amqp_empty_bytes, amqp_empty_table);
原文地址:http://blog.51cto.com/fengyuzaitu/2147101