之前的例子都是讲消息直接发送给指定的队列;现在需要发送给多个队列,订阅/发布模式
生产者不再将消息直接发往队列,而是发往exchange,然后exchange再发送给在该exchange订阅的队列;
exchange需要知道如何对接收到的消息进行转发
exchange有四种类型:direct, topic, headers and fanout
一:fanout类型
将消息发给所有在exchange注册的队列
channel.exchangeDeclare("logs", "fanout");//1:声明一个fanout的exchange
channel.queueBind(queueName, "logs", "");//将队列在exchange注册
channel.basicPublish("logs", "", null, message.getBytes());//发送消息
二:direct类型
fanout类型的exchange可以将消息发送给在exchange上注册的所有的队列;
队列注册到direct类型的exchange时增加了route_key,每一个消息都有一个key,消息的key与队列的route_key一致时才会发往该队列;
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
channel.basicPublish(EXCHANGE_NAME, "key", null, message.getBytes());
channel.queueBind(queueName, EXCHANGE_NAME, "key");
三:topic类型
direct类型中有一个缺点是:必须要消息的key和订阅的route_key完全一致才会发送到相应队列;topic类型增加了相当于模糊匹配的功能;
*代表一个字符
#代表0个或多个字符
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.basicPublish(EXCHANGE_NAME, "key.t", null, message.getBytes());
channel.queueBind(queueName, EXCHANGE_NAME, "key.*");