RabbitMQ从0到1入门

一.介绍

RabbitMQ是Erlang语言开发,基于AMQP协议实现的消息队列,在中小型企业应用广泛。


二.应用场景

  • 任务异步处理

  • 应用程序解耦

  • 流量削峰

  • 日志处理


三.优势

  • 使用简单,功能强大
  • 基于AMQP协议(这是一种二进制协议,提供客户端与消息中间件之间异步、安全、高效地交互)
  • 社区活跃,文档完善
  • 使用Erlang语言开发,高并发性能好
  • SpringBoot默认已经集成RabbitMQ

四.工作流程

在这里插入图片描述

  • 发送消息

    1. 生产者(producer)和Broker(MQ)建立TCP连接,然后建立通道(channel);
    2. 生产者通过通道,将消息发送给Broker,由交换机(Exchange)进行转发;
    3. 交换机将消息发送到队列(Queue)
  • 接收消息

    1. 消费者(consumer)和Broker建立TCP连接,然后建立通道;
    2. 消费者监听指定队列;
    3. 当有消息到达队列中,Broker默认将消息推送给消费者;
    4. 消费者接收到消息

五.RabbitMQ安装

  • 先安装otp_win64_19.3.exe,然后安装rabbitmq-server-3.7.3.exe。两个除了路径自选以外,其他都是一直点击就行。
  • RabbitMQ会将服务加入系统服务中。
  • 如果需要在浏览器管理RabbitMQ,则需要安装插件:
    1. cmd进入RabbitMQ安装目录下的sbin目录下,输入rabbitmq-plugins.bat enable rabbitmq_management
    2. 然后浏览器通过ip:15672进入,则可以访问网页端
    3. 账号密码默认都是guest

六.入门程序

  • 使用依赖

    maven

    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.1.2</version>
    </dependency>
    

    gradle

    compile group: 'com.rabbitmq', name: 'amqp-client', version: '4.0.3'
    
  • 代码


创建连接工厂(ConnectionUtil)

public static Connection getConnection() throws IOException, TimeoutException
{
    //通过连接工厂创建和MQ的连接
    ConnectionFactory connectionFactory = new ConnectionFactory();
    connectionFactory.setHost("127.0.0.1");
    connectionFactory.setPort(5672);
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");

    // 设置虚拟机(一个MQ可以设置多个虚拟机,每个虚拟机相当于一个独立的MQ)
    // connectionFactory.setVirtualHost("/");

    //建立新连接
    return connectionFactory.newConnection();
}

生产者(Producer)

private static final String QUEUE = "hello";

public static void main(String[] args) throws IOException, TimeoutException
{
    //建立新连接
    Connection conn = ConnectionTool.getConnection();
    //创建会话channel
    Channel channel = conn.createChannel();

    //声明一个消息队列
    /*
    参数:对应参数查看
    1.queue : 队列名称
    2.durable: 是否持久化, true ,表示持久化,会存盘,服务器重启仍然存在; false,非持久化
    3.exclusive : 是否排他的,true,排他。如果一个队列声明为排他队列,该队列公对首次声明它的连接可见,并在连接断开时自动删除
    4.autoDelete :是否自动删除,前提:至少有一个消息者连接到这个队列,之后所有与这个队列连接的消息都断开时,才会自动删除
    5.arguments : 其他参数
    */
    channel.queueDeclare(QUEUE, true, false, false, null);

    //通过channel发送数据
    /*
    参数:对应参数查看
    1.交换机名称
    2.路由
    3.消息属性
    4.消息体(byte[])
    */
    channel.basicPublish("", QUEUE, null, "Hello World".getBytes());

    System.out.println("----------------------已发送");

    //关闭连接
    channel.close();
    conn.close();
}

消费者(Consumer)

消费者不用关闭,一直保持监听状态即可

private static final String QUEUE = "hello";

public static void main(String[] args) throws IOException, TimeoutException
{
    //创建连接
    Connection conn = ConnectionTool.getConnection();

    //创建channel
    Channel channel = conn.createChannel();

    //监听一个消息队列
    /*
    参数:对应参数查看
    1.queue : 队列名称
    2.durable: 是否持久化, true ,表示持久化,会存盘,服务器重启仍然存在; false,非持久化
    3.exclusive : 是否排他的,true,排他。如果一个队列声明为排他队列,该队列公对首次声明它的连接可见,并在连接断开时自动删除
    4.autoDelete :是否自动删除,前提:至少有一个消息者连接到这个队列,之后所有与这个队列连接的消息都断开时,才会自动删除
    5.arguments : 其他参数
    */
    channel.queueDeclare(QUEUE, true, false, false, null);

    //实现消费方法,当接收到消息后,调用此方法
    DefaultConsumer defaultConsumer = new DefaultConsumer(channel)
    {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
        {
            //得到交换机
            String exchange = envelope.getExchange();
            //标识消息的id,用于确认消息接收
            long deliveryTag = envelope.getDeliveryTag();
            //消息的内容
            String msg = new String(body, "utf-8");
            System.out.println("--------------------------------receive message : " + msg);
        }
    };

    //监听队列
    /*
    * 1.队列名
    * 2.是否自动回复MQ,告知消息已接收
    * 3.callback,接收到消息后,执行方法
    * */
    channel.basicConsume(QUEUE, true, defaultConsumer);
}

猜你喜欢

转载自blog.csdn.net/qq_40579464/article/details/106034242