RabbitMQ快速入门

文章目录

  • [一. 引入依赖](#一. 引入依赖)
  • [二. 编写生产者代码](#二. 编写生产者代码)
      • [1. 创建连接](#1. 创建连接)
      • [2. 创建channel](#2. 创建channel)
      • [3. 声明一个队列](#3. 声明一个队列)
      • [4. 发送消息](#4. 发送消息)
      • [5. 释放资源](#5. 释放资源)
      • [6. 运行代码](#6. 运行代码)
  • [三. 编写消费者代码](#三. 编写消费者代码)
      • [1. 创建连接](#1. 创建连接)
      • [2. 创建channel](#2. 创建channel)
      • [3. 声明队列](#3. 声明队列)
      • [4. 消费消息](#4. 消费消息)
      • [5. 释放资源](#5. 释放资源)
      • [6. 运行代码](#6. 运行代码)

一. 引入依赖

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.20.0</version>
</dependency>

二. 编写生产者代码

RabbitMQ 默认的⽤于客⼾端连接的TCP 端⼝号是5672, 需要提前进⾏开放

1. 创建连接

java 复制代码
 public static void main(String[] args) throws IOException, TimeoutException {
        //1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2. 设置参数
        factory.setHost("139.9.84.204");//ip
        factory.setPort(5672);//端口号
        factory.setVirtualHost("study");//虚拟机名称
        factory.setUsername("admin");//用户名
        factory.setPassword("admin");//密码
        //3. 创建连接connection
        Connection connection = factory.newConnection();

    }

2. 创建channel

java 复制代码
     //创建channel
        Channel channel = connection.createChannel();

3. 声明一个队列

java 复制代码
		//声明队列
        //如果没有一个hello这样的队列, 会自动创建, 如果有, 则不创建
        channel.queueDeclare("hello", true, false, false, null);

参数说明:

  • queue: 队列名称
  • durable: 是否持久化, 设置为true, 待持久化的队列会存盘, 服务器重启之后, 消息不会丢失
  • exclusive:
    是否独占, 只能有一个消费者监听队列
    当Connection关闭时, 是否删除队列
  • autoDelete: 是否自动删除, 当没有Consumer时, 自动删除
  • arguments: 参数

4. 发送消息

每个虚拟机会有几个内置的交换机, 内置交换机的名称是空字符串("")

我们现在要编写的事简单的应用场景, 使用内置交换机即可, 此时, 生产者发送的消息会根据队列名直接路由到对应的队列, 无需关心交换机

java 复制代码
		//发送消息
        String msg = "Hello RabbitMQ";
        channel.basicPublish("", "hello", null, msg.getBytes(StandardCharsets.UTF_8));

参数说明:

  • exchange: 交换机名称
  • routingKey: 路由名称, 当使用内置交换机时, routingKey = 队列名称
  • props: 配置信息
  • body: 发送消息的数据

5. 释放资源

java 复制代码
		 //释放资源
        channel.close();
        connection.close();

6. 运行代码

队列添加成功

点进去就可以看到消息

如果没有进行资源释放, 就会看到连接信息和channel信息

三. 编写消费者代码

1. 创建连接

java 复制代码
 public static void main(String[] args) throws IOException, TimeoutException {
        //1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2. 设置参数
        factory.setHost("139.9.84.204");//ip
        factory.setPort(5672);//端口号
        factory.setVirtualHost("study");//虚拟机名称
        factory.setUsername("admin");//用户名
        factory.setPassword("admin");//密码
        //3. 创建连接connection
        Connection connection = factory.newConnection();

    }

2. 创建channel

java 复制代码
     //创建channel
        Channel channel = connection.createChannel();

3. 声明队列

如果生产者已经声明了队列, 这步可以省略

java 复制代码
		//声明队列
        //如果没有一个hello这样的队列, 会自动创建, 如果有, 则不创建
        channel.queueDeclare("hello", true, false, false, null);

4. 消费消息

java 复制代码
		//消费消息
        DefaultConsumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("获取到队列: " + new String(body));
            }
        };
        channel.basicConsume("hello", true, consumer);     

basicConsume参数声明:

  • queue: 队列名称
  • autoAck: 是否自动确认, 消费者收到消息之后,自动和MQ确认
  • callback: Consumer类型, 表示接收到消息后, 需要执行的逻辑

Consumer介绍:

Consumer 用于定义消息消费者的行为. 当我们需要从RabbitMQ接收消息时, 需要提供⼀个实现了Consumer 接口的对象.

DefaultConsumer 是 RabbitMQ提供的⼀个默认消费者, 实现了Consumer 接口

核心方法:

从队列接收到消息时, 会⾃动调⽤该⽅法.

在这个方法中, 我们可以定义如何处理接收到的消息, 例如打印消息内容, 处理业务逻辑或者将消息

存储到数据库等

5. 释放资源

java 复制代码
 		 //释放资源
        channel.close();
        connection.close();

6. 运行代码


此时就消费了hello队列中的消息

目前只能看到打印一条数据, 因为还没等打印成功, 资源就被释放了

可以加入等待, 让等全部打印成功后再进行资源释放

生产10条数据:

执行:

相关推荐
大飞哥~BigFei2 小时前
RabbitMq消费延迟衰减重试实现思路
java·分布式·rabbitmq
java_logo12 小时前
NGINX WEBUI Docker 容器化部署指南
运维·nginx·docker·容器·centos·rabbitmq·运维开发
小泊客13 小时前
使用讯飞星火 Spark X1-32K 打造本地知识助手
大数据·分布式·spark·大模型应用·本地知识助手
Ace_317508877617 小时前
京东关键字搜索接口逆向:从动态签名破解到分布式请求调度
分布式·python
❀͜͡傀儡师17 小时前
使用DelayQueue 分布式延时队列,干掉定时任务!
java·分布式·delayqueue·spingboot
失散1317 小时前
分布式专题——55 ElasticSearch性能调优最佳实践
java·分布式·elasticsearch·架构
easy_coder19 小时前
MinIO:云原生时代的分布式对象存储从入门到精通
分布式·云原生
L.EscaRC21 小时前
ArkTS分布式设计模式浅析
分布式·设计模式·arkts
q***33371 天前
Spring Boot 中 RabbitMQ 的使用
spring boot·rabbitmq·java-rabbitmq
观望过往1 天前
Spring Boot 与 RabbitMQ 集成示例
spring boot·rabbitmq·java-rabbitmq