易学笔记-RabbitMQ教程3:一个消息发给所有消费者(路由器类型为:fanout)

  • RabbitMQ教程3:一个消息发给多个消费者
  1. 代码基础: 易学笔记-RabbitMQ教程1:一个生产者和一个消费者
  2. 错误的消息队列模型
    1. 生产者:发送消息的用户程序
    2. 队列:存储消息的缓冲区
    3. 消费者:接收消息的用户程序
  3. 正确的队列模型
    1. 生产者:发送消息的用户程序
    2. 交换器:存储消息的缓冲区,生产者从交换器中发布消息
    3. 队列:接受交换器中消息的一个中介
    4. 消费者:接收消息的用户程序
  4. 交换器(路由器):Exchange: 
    1. 类型:
      1. direct
      2. topic
      3. headers
      4. fanout
    2. 往交换器中
    3. 匿名Exchange:   channel.basicPublish("",第一个参数为空则为匿名Exchange
  5. 临时队列
    1. 概念:不指定名称的队列,临时又系统自动生成队列名称
    2. 用处:为了接收某个Exchange所有的消息
  6. 交换器和队列的绑定
    1. 交换器一定在生产者声明,而队列可以在生产者定义,也可以在消费者定义
    2. 绑定:也就是队列从交换器中获取消息
  7. 新建生产者:
    package oneProductAllConsume;
    
    import com.rabbitmq.client.BuiltinExchangeType;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.Channel;
    
    public class ExchangesProductSend {
    
    	private static final String EXCHANGE_NAME = "logs";
    
    	public static void main(String[] argv) throws Exception {
    		// 建立连接和通道
    		ConnectionFactory factory = new ConnectionFactory();
    		factory.setHost("localhost");
    		Connection connection = factory.newConnection();
    		Channel channel = connection.createChannel();
    
    		/**
    		 *  声明路由以及路由的类型
    		 */
    		channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
    
    		String message = "msg...";
    
    		/**
    		 * 这里没有指明队列,队列由消费者指定
    		 */
    		/**
    		 *  发布消息
    		 *  这里的消息发布到EXCHANGE,再有EXCHANGE发布到队列
    		 */
    		channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
    		System.out.println(" [x] Sent '" + message + "'");
    
    		// 关闭连接和通道
    		channel.close();
    		connection.close();
    	}
    }
    
    1.       * 定义 EXCHANGE名称

            */

           private static final String EXCHANGE_NAME = "logs";

    2. 声明交换器类型

      /**

                  *  声明路由以及路由的类型

                  */

                 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

    3. 往交换器中发布消息

      /**

                  * 这里没有指明队列,队列由消费者指定

                  */

                 /**

                  *  发布消息

                  *  这里的消息发布到指定的EXCHANGE(logs),再由EXCHANGE发布到队列

                  */

                 channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));

    定义交换器名称/**
  8. 新建消费者:RandomQueueConsumeRecv.java
    1. /**

            * 定义 EXCHANGE名称

            */

           private static final String EXCHANGE_NAME = "logs";

    2. 声明交换器类型,要求要与生产者一致

      /**

                  *  声明路由以及路由的类型

                  */

                 channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

    3. 声明随机队列

       /**

               * 声明一个随机名字的队列

               */

              String queueName = channel.queueDeclare().getQueue();

    4. 交换器和队列绑定

       /**

               * 绑定队列到路由器上

               */

              channel.queueBind(queueName, EXCHANGE_NAME, "");

    5. 定义消费对象以及从队列上获取消息:和原来的一样
  9. 测试:
    1. 先启动两个消费者
      1. 消费者一:
      2. 消费者二:
    2. 启动生产者
    3. 消费者接受到生产者所有消息

猜你喜欢

转载自blog.csdn.net/u011830122/article/details/83956234
今日推荐