功能
接收消息,并根据路由键转发消息所绑定的队列
Exchange的相关属性
Name: 交换机名称
Type: 交换机类型 direct topic fanout headers等
Durability: 是否要持久化 true意为持久化
AutoDelete: 当最后一个绑定到Exchange的队列删除后,自动删除该Exchange
Internal: 当前Exchange是否用于RabbitMQ内部使用,默认为false
Arguments: 扩展AMQP协议自定义使用
接下来介绍三种Exchange,分别为 direct topic fanout
Direct Exchange
所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue
*可以使用RabbitMQ自带的default Exchange,无需binding操作,消息传递时,RouteKey必须完全匹配才会被队列接收,否则抛弃。
代码方面
//参数二指定交换机类型,参数三四五六分别为:
//是否可持久化 是否自动删除 是否仅内部使用
channel.exchangeDeclare(exchangeName,"direct",true,false,false,null);
//声明队列 名字 可持久化 独占性 自动删除 附加信息
channel.queueDeclare(queueName,false,false,false,null);
//建立一个绑定关系 队列名 交换机名 路由键
channel.queueBind(queueName,exchangeName,routingKey);
Topic Exchange
所有发送到Topic Exchange的消息被转发到所有关心RoutingKey中指定Topic的Queue上
Exchange将RouteKey和某Topic进行匹配,此时队列需要绑定一个topic
这是什么意思呢,我到别的地方找了一张图,解释的较为清楚:
代码方面,可以用通配符进行模糊匹配,其中#匹配一个或多个词,*匹配仅一个词,举个例子
log.# 匹配到log.info.aa
log.* 匹配到log.info,匹配不到log.info.aa
其中你可以把log.#作为声明时的routingKey,然后把log.info.aa这种
作为投递消息时用的routingKey
就好比你拿log.info.aa去开锁,而门锁要求log.#的锁才能开,所以你的锁当然开的开,也就能通过这个routingKey路由到相应队列中
Java代码与其他差不多,就是声明exchange的时候参数二为"topic"
Fanout Exchange
不处理路由键,只需把队列绑到交换机上
发送到交换机的消息全被转发到与该交换机绑定的所有队列上
因此Fanout交换机转发消息是最快的
Java代码上就是声明exchange的参数二为"",而publish的时候routingKey可以随便写,反正没啥关系了。