fanout模式:广播模式,不关心routingKey,只要和fanout类型交换机绑定的 队列,在交换机接收到消息时,会将消息转发到所有与该交换机绑定的队列
消费者1:
package com.vivo.demo1.fanout;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author:luzaichun
* @Date:2020/12/15
* @Time:23:52
**/
public class Consumer1 {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.3.7");
factory.setPort(5672);
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("fanout_exchange","fanout",false,false,null);
channel.queueDeclare("fanout_queue_1",false,false,false,null);
channel.queueBind("fanout_queue_1","fanout_exchange","fanout1");
channel.basicConsume("fanout_queue_1",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("队列1的消息:"+new String(body));
}
});
}
}
消费者2:
package com.vivo.demo1.fanout;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author:luzaichun
* @Date:2020/12/15
* @Time:23:52
**/
public class Consumer2 {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.3.7");
factory.setPort(5672);
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("fanout_exchange","fanout",false,false,null);
channel.queueDeclare("fanout_queue_2",false,false,false,null);
channel.queueBind("fanout_queue_2","fanout_exchange","fanout2");
channel.basicConsume("fanout_queue_2",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("队列2的消息:"+new String(body));
}
});
}
}
生产者:
package com.vivo.demo1.fanout;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author:luzaichun
* @Date:2020/12/15
* @Time:23:55
**/
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.3.7");
factory.setPort(5672);
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
for (int i = 0; i < 5; i++) {
channel.basicPublish("fanout_exchange", "", null, "fanout消息".getBytes());
}
channel.close();
connection.close();
}
}
启动消费者1和消费者2,这样fanout_queue_1
和fanout_queue_2
两个队列就都和fanout类型的交换机fanout_exchange
绑定了。我们可以看到生产者发送消息的时候,routingKey为空字符串,没有指定。但是可以看到消费者1和消费者2都收到了5条消息。说明fanout模式的交换机消息的路由的确和路由键没有关系,并且消息是广播方式发送。