RabbitMQ交换机类型---fanout、topic、direct

一、fanout类型

(1)消息生产者

特点:不需要routing key,简称广播模式,所有消费者都可以收到信息

public class Produce {
    private static final String EXCHANGE_NAME = "exchange_name";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
        Scanner scanner = new Scanner(System.in);

        while(true) {
            String message = scanner.next();
            channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
            System.out.println("message消息发送成功 = " + message);
        }
    }
}

(2)消息消费者

public class ReceiveLog1 {
    private static final String EXCHANGE_NAME = "exchange_name";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
        String queueName = channel.queueDeclare().getQueue();
        channel.queueBind(queueName, EXCHANGE_NAME, "");
        DeliverCallback deliverCallback = (consumerTag, message)->{
            String mess = new String(message.getBody());
            System.out.println("consumer1 消费的信息是 = " + mess);
        };
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("consumer1 未消费的信息是 = " + consumerTag);
        };
        channel.basicConsume(queueName, true, deliverCallback, cancelCallback);
    }
}

二、direct类型

特点:需要绑定routing key,队列和交换机的routing key值相同的队列才能收到消息

(1)消息生产者

public class ProduceDirect {
    private static final String EXCHANGE_DIRECT = "exchange_direct";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String message = scanner.next();
            channel.basicPublish(EXCHANGE_DIRECT, "error", null, message.getBytes());
        }
    }
}

(2)消息消费者1

public class ReceiveDirect1 {
    private static final String EXCHANGE_DIRECT = "exchange_direct";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
        channel.queueDeclare("console", false, false, false, null);
        channel.queueBind("console", EXCHANGE_DIRECT, "info");
        channel.queueBind("console", EXCHANGE_DIRECT, "waring");
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String mess = new String(message.getBody());
            System.out.println("队列console接收到信息 = " + mess);
        };
        CancelCallback cancelCallback = consumerTag -> {

        };
        channel.basicConsume("console", true, deliverCallback, cancelCallback);
    }
}

消息消费者2

public class ReceiveDirect2 {
    private static final String EXCHANGE_DIRECT = "exchange_direct";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
        channel.queueDeclare("disk", false, false, false, null);
        channel.queueBind("disk", EXCHANGE_DIRECT, "error");
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String mess = new String(message.getBody());
            System.out.println("队列disk接收到信息 = " + mess);
        };
        CancelCallback cancelCallback = consumerTag -> {

        };
        channel.basicConsume("disk", true, deliverCallback, cancelCallback);
    }
}

三、topic类型

特点:主题模式,可以通过routing key的值进行消息的消费,

代表一个单词

#  :代表一个或者多个单词

(1)消息的生产者

public class ProduceTopic {
    private static final String EXCHANGE_TOPIC = "exchange_topic";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();
            channel.basicPublish(EXCHANGE_TOPIC, "one.orange.rabbit", null,message.getBytes("UTF-8"));
        }

    }
}

(2)消息消费者1

public class Topic1 {
    private static final String EXCHANGE_TOPIC = "exchange_topic";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
        channel.queueDeclare("Q1", false, false, false, null);
        channel.queueBind("Q1", EXCHANGE_TOPIC, "*.orange.*");
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String s = new String(message.getBody(),"UTF-8");
            //System.out.println("Q1消费的消息 = " + s +"---routingKey 是 = "+ message.getEnvelope().getRoutingKey());
            System.out.println(s);
        };
        CancelCallback cancelCallback = consumerTag -> {

        };
        channel.basicConsume("Q1", true, deliverCallback, cancelCallback);
    }
}

消息消费者2

public class Topic2 {
    private static final String EXCHANGE_TOPIC = "exchange_topic";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitUtils.getChannel();
        channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
        channel.queueDeclare("Q2", false, false, false, null);
        channel.queueBind("Q2", EXCHANGE_TOPIC, "*.*.rabbit");
        channel.queueBind("Q2", EXCHANGE_TOPIC, "lazy.#");
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String s = new String(message.getBody(), "UTF-8");
            //System.out.println("Q2消费的消息 = " + s +"---routingKey 是 = "+ message.getEnvelope().getRoutingKey());
            System.out.println(s);
        };
        CancelCallback cancelCallback = consumerTag -> {

        };
        channel.basicConsume("Q2", true, deliverCallback, cancelCallback);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_60892962/article/details/122129851