上一篇通过代码演示了最简单的交换器--direct交换器
本篇学习一下其他的交换器(Fanout、Topic)
一、Fanout交换器
又称为广播交换器,不处理路由键。只要是绑定到该交换器上的队列都能收到这个消息,Fanout交换机转发消息是最快的
创建方式很简单,只需要指定交换器的类型即可
生产者代码如下
public class FanoutProducer {
public final static String EXCHANGE_NAME = "fanoutLogs";
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接连接到MabbitMQ
ConnectionFactory factory = new ConnectionFactory();
//设置MabbitMQ所在主机ip或者主机名
factory.setHost("127.0.0.1");
//创建一个连接
Connection connection = factory.newConnection();
//创建一个信道
Channel channel = connection.createChannel();
/**********指定交换器的类型是广播************/
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
/*日志消息级别,作为路由键使用*/
String[] routekeys = {"zc1","zc2","zc3"};
for(int i=0;i<3;i++){
String routekey = routekeys[i%3];//每一次发送一条消息
// 发送的消息
String message = "Hello World_"+(i+1);
//参数1:exchange name
//参数2:routing key
channel.basicPublish(EXCHANGE_NAME,routekey,null, message.getBytes());
}
// 关闭信道和连接
channel.close();
connection.close();
}
}
消费者
public class Consumer2 {
public static void main(String[] argv) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
//打开连接和创建信道,与发送端一样
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
channel.exchangeDeclare(FanoutProducer.EXCHANGE_NAME,BuiltinExchangeType.FANOUT);
//声明一个随机队列
String queueName = channel.queueDeclare().getQueue();
//设置一个不存在的路由键
String routekey="zc";
channel.queueBind(queueName, FanoutProducer.EXCHANGE_NAME, routekey);
System.out.println(" [*] Waiting for messages......");
// 创建队列消费者
final Consumer consumerB = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
//假装消费
System.out.println( "Received ["+ envelope.getRoutingKey()+ "]"+message);
}
};
channel.basicConsume(queueName, true, consumerB);
}
}
小结:使用了FANOUT交换器,即采用了广播模式,即每一个队列都能接收到,无论队列绑定的是什么路由键。
二、Topic交换器
之前说过路由键是一个最长为255的字符串,有一个特殊符号“.”,将路由键分为几级
比如路由键 zc.car.color
同时还有两个特殊符号“*”,“#”,类似于通配符,
“*”匹配 1 个
“#”匹配一个或多个
在寻找队列时,根据匹配结果将消息发布到对应队列上,其他没什么特殊的,在声明时指定交换器的类型即可,就不展示代码了