原理图:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费
生产者
// 1.创建新的连接 Connection connection = ConnectionUtils.getConnection(); // 2.创建通道 Channel channel = connection.createChannel(); // 3.绑定的交换机 参数1交互机名称 参数2 exchange类型 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); String msg = "fanout_exchange_msg"; // 4.发送消息 channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes()); // System.out.println("生产者发送msg:" + msg); // // 5.关闭通道、连接 channel.close(); connection.close();
消费者:
public class Consumer_email { private final static String EXCHANGE_NAME="fanout_exchange";//交换机名称 private final static String QUEUE_NAME="email";//队列名称 public static void main(String[] args) throws IOException, TimeoutException { //获取连接 Connection connection=ConnectionUtils.getConnection(); //获取通道 Channel channel=connection.createChannel(); //绑定交换机(参数1交互机名称 参数2 exchange类型) channel.exchangeDeclare(EXCHANGE_NAME,"fanout"); // 4.消费者绑定交换机 参数1 队列 参数2交换机 参数3 routingKey channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); DefaultConsumer consumer =new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String msg = new String(body, "UTF-8"); System.out.println("邮件消费者获取生产者消息:" + msg); } }; // 5.消费者监听队列消息 channel.basicConsume(QUEUE_NAME, true, consumer); }
注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。