fanout(Publish/Subscribe)发布/订阅

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 14:54:30

1.模型

 

 

 2.创建生产者

package com.dwz.rabbitmq.exchange.fanout;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.dwz.rabbitmq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        
        String exchangeName = "test_fanout_exchange";
        
        String msg = "hello rabbitmq fanout message successs!--";
        for(int i = 0; i < 50; i++) {
            channel.basicPublish(exchangeName, "", null, (msg + i).getBytes());
        }
        
        channel.close();
        connection.close();
    }
}

3.创建消费者1

package com.dwz.rabbitmq.exchange.fanout;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.dwz.rabbitmq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        
        //交换机名称
        String exchangeName = "test_fanout_exchange";
        //交换机类型
        String exchangeType = "fanout";
        String queueName = "test_fanout_queue_1";
        //路由键
        String routingKey = "";
        //交换机声明
        channel.exchangeDeclare(exchangeName, exchangeType, true, false, null);
        /*
         * durable:持久化,服务器重启,数据仍然存在
         * exclusive:独占一个channel,用于顺序消费,类似于加了一把锁
         * autoDelete:如果一个队列脱离了exchange会自动删除
         */
        //队列声明
        channel.queueDeclare(queueName, false, false, false, null);
        //队列绑定交换机
        channel.queueBind(queueName, exchangeName, routingKey);
        
        //定义消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "utf-8");
                System.out.println("rec1--message:" + msg);
            }
        };
        //设置消费者
        channel.basicConsume(queueName, true, consumer);
    }
}

4.创建消费者2

package com.dwz.rabbitmq.exchange.fanout;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.dwz.rabbitmq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;

public class Consumer2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        
        String exchangeName = "test_fanout_exchange";
        String exchangeType = "fanout";
        String queueName = "test_fanout_queue_2";
        String routingKey = "";
        channel.exchangeDeclare(exchangeName, exchangeType, true, false, null);
        /*
         * durable:持久化,服务器重启,数据仍然存在
         * exclusive:独占一个channel,用于顺序消费,类似于加了一把锁
         * autoDelete:如果一个队列脱离了exchange会自动删除
         */
        channel.queueDeclare(queueName, false, false, false, null);
        channel.queueBind(queueName, exchangeName, routingKey);
        
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "utf-8");
                System.out.println("rec2--message:" + msg);
            }
        };
        channel.basicConsume(queueName, true, consumer);
    }
}

5.运行代码

先启动两个消费者,再启动生产者,运行结果:

两个消费者都拿到exchange(交换机)的全部信息

注:由于exchange只是做一个消息转发,本身是不具备存储数据的能力,如果先启动生产者,信息是到达不了队列的,队列有存储数据的功能

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!