RabbitMQ之交换机

文章目录

  • 1. 交换机概念
  • 2. fanout交换机
  • 3. direct交换机
  • 4. topic交换机

1. 交换机概念

RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定
RabbitMQ之交换机_第1张图片

交换机的类型:

  1. 直接(direct)
  2. 扇出(fanout)
  3. 标题(headers)
  4. 主题(topic)

默认交换机
在这里插入图片描述
第一个参数是交换机的名称。空字符串表示默认或无名称交换机:消息能路由发送到队列中其实是由 routingKey(bindingkey)绑定 key 指定的,如果key存在的话


2. fanout交换机

将接收到的所有消息广播到它知道的所有队列中
RabbitMQ之交换机_第2张图片

 public static Channel getChannerl() throws IOException, TimeoutException {
   
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setUsername("admin");
        factory.setPassword("123");
        Connection connection = factory.newConnection();
        return connection.createChannel();
    }

ReceiveLog01

package cn.edu.xd.fanout;

import cn.edu.xd.util.RabbitMQUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

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

public class ReceiveLog01 {
   
    private static final String EXCHANGE_NAME="logs";
    public static void main(String[] args) throws IOException, TimeoutException {
   
        Channel channel= RabbitMQUtils.getChannerl();
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
        /**
         * 生成一个临时的队列 队列的名称是随机的
         * 当消费者断开和该队列的连接时 队列自动删除
         */
        String queueName=channel.queueDeclare().getQueue();
        //把该临时队列绑定exchange 其中 routingkey(也称之为 binding key)为空字符串
        channel.queueBind(queueName,EXCHANGE_NAME,"");
        System.out.println("ReceiveLog01等待接收消息...");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
   
            String message = new String(delivery.getBody());
            System.out.println("ReceiveLog01接受到的消息:"+message);
        };
        //取消消费的一个回调接口 如在消费的时候队列被删除掉了
        CancelCallback cancelCallback = s -> {
   
            System.out.println("消息被中断");

        };
        channel.basicConsume(queueName,true,deliverCallback,cancelCallback);
    }
}

ReceiveLog02

package cn.edu.xd.fanout;

import cn.edu.xd.util.RabbitMQUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

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

public class ReceiveLog02 {
   
    private static final String EXCHANGE_NAME="logs";
    public static void main(String[] args) throws IOException, TimeoutException {
   
        Channel channel= RabbitMQUtils.getChannerl();
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
        /**
         * 生成一个临时的队列 队列的名称是随机的
         * 当消费者断开和该队列的连接时 队列自动删除
         */
        String queueName=channel.queueDeclare().getQueue();
        //把该临时队列绑定exchange 其中 routingkey(也称之为 binding key)为空字符串
        channel.queueBind(queueName,EXCHANGE_NAME,"");
        System.out.println("ReceiveLog02等待接收消息...");
        DeliverCallback deliverCallback = 

你可能感兴趣的:(RabbitMQ,rabbitmq,分布式)