03 RabbitMQ:HelloWorld

03 RabbitMQ:HelloWorld

  • [1. 目标](#1. 目标)
  • [2. 实现](#2. 实现)
    • [2.1. 新建Spring Boot 项目](#2.1. 新建Spring Boot 项目)
      • [2.1.1. 新建生产者(producer)项目](#2.1.1. 新建生产者(producer)项目)
      • [2.1.2. 新建生产者(consumer)项目](#2.1.2. 新建生产者(consumer)项目)
    • [2.2. 导入依赖](#2.2. 导入依赖)
    • [2.3. 代码](#2.3. 代码)
      • [2.3.1. 发送消息(producer)](#2.3.1. 发送消息(producer))
      • [2.3.2. 接收消息(consumer)](#2.3.2. 接收消息(consumer))

1. 目标

用Java代码实现简单的 生产者发送消息,消费者接收消息

官网说明参见超链接:RabbitMQ tutorial - "Hello World!" | RabbitMQ

2. 实现

2.1. 新建Spring Boot 项目

2.1.1. 新建生产者(producer)项目

2.1.2. 新建生产者(consumer)项目

2.2. 导入依赖

xml 复制代码
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.21.0</version>
</dependency>

2.3. 代码

2.3.1. 发送消息(producer)

java 复制代码
package com.eyesmoon.producer.demo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @Description: 生产者
 * @Author: M.
 * @Date: 2024-07-30 16:40
 */
public class Producer {

    private static final String QUEUE_NAME = "simple-queue";
    private static final String EXCHANGE_NAME = "";
    private static final String ROUTING_KEY = "simple-queue";
    public static void main(String[] args) {
        // 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置主机地址
        connectionFactory.setHost("192.168.188.129");
        // 设置连接端口号:默认为 5672
        connectionFactory.setPort(5672);
        // 虚拟主机名称:默认为 /
        connectionFactory.setVirtualHost("/");
        // 设置连接用户名;admin
        connectionFactory.setUsername("admin");
        // 设置连接密码;123456
        connectionFactory.setPassword("123456");

        try (// 创建连接
             Connection connection = connectionFactory.newConnection();
             // 创建频道
             Channel channel = connection.createChannel()){

            /**
             * 声明(创建)队列
             * 参数1:队列名称
             * 参数2:是否定义持久化队列(当 MQ 重启之后还在)
             * 参数3:是否独占本次连接(若独占,只能有一个消费者监听这个队列且 Connection 关闭时删除这个队列)
             * 参数4:是否在不使用的时候自动删除队列(就是在没有Consumer时自动删除)
             * 参数5:队列其它参数
             */
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);

            /**
             * 发送消息:消息内容
             */
            String message = "你好,小兔子!";

            /**
             * 参数1:交换机名称,如果没有指定则使用默认Default Exchange
             * 参数2:路由key,简单模式可以传递队列名称
             * 参数3:配置信息
             * 参数4:消息内容
             */
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
            System.out.println("生产者(Producer)已发送消息:" + message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

页面查看:

详细参数请查看 04 RabbitMQ:控制界面详解
Ready 变为了1,说明消息已经存放在队列中。


2.3.2. 接收消息(consumer)

java 复制代码
package com.eyesmoon.consumer.demo;

import com.rabbitmq.client.*;
import java.nio.charset.StandardCharsets;

/**
 * @Description: 消费者
 * @Author: M.
 * @Date: 2024-07-30 17:59
 */
public class Consumer {

    private static final String QUEUE_NAME = "simple-queue";
    public static void main(String[] args) {
        // 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置主机地址
        connectionFactory.setHost("192.168.188.129");
        // 设置连接端口号:默认为 5672
        connectionFactory.setPort(5672);
        // 虚拟主机名称:默认为 /
        connectionFactory.setVirtualHost("/");
        // 设置连接用户名;admin
        connectionFactory.setUsername("admin");
        // 设置连接密码;123456
        connectionFactory.setPassword("123456");

        try (// 创建连接
             Connection connection = connectionFactory.newConnection();
             // 创建频道
             Channel channel = connection.createChannel()){

            // 接收消息
            DefaultConsumer consumer = new DefaultConsumer(channel) {
                /**
                 * 回调方法,当收到消息后,会自动执行该方法
                 * @param consumerTag 标识
                 * @param envelope 获取一些信息,交换机,路由key...
                 * @param properties 配置信息
                 * @param body 数据
                 */
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                    System.out.println("consumerTag:" + consumerTag);
                    System.out.println("Exchange:" + envelope.getExchange());
                    System.out.println("RoutingKey:" + envelope.getRoutingKey());
                    System.out.println("properties:" + properties);
                    System.out.println("body:" + new String(body, StandardCharsets.UTF_8));
                }
            };
            /**
             * 监听消息
             * 参数1:队列名称
             * 参数2:是否自动确认(类似咱们发短信,发送成功会收到一个确认消息)
             * 参数3:回调对象
             */
            channel.basicConsume(QUEUE_NAME,true, consumer);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

页面查看:

详细参数请查看 04 RabbitMQ:控制界面详解
Ready 变为了0,说明消息已经被消费。消息在队列中已经被删除。


本文隶属于 【个人专栏】:06 RabbitMQ 📋📋📋

到这里 03 RabbitMQ:HelloWorld 就结束了!!!🎉🎉🎉

后续接 04 RabbitMQ:控制界面详解 📣📣📣

欢迎小伙伴们学习和指正!!!😊😊😊

祝大家学习和工作一切顺利!!!😎😎😎

相关推荐
spiker_4 小时前
RabbitMQ 常见使用模式详解
分布式·rabbitmq
不能再留遗憾了4 小时前
RabbitMQ 高级特性——持久化
分布式·rabbitmq·ruby
成为大佬先秃头4 小时前
解决RabbitMQ设置TTL过期后不进入死信队列
分布式·中间件·rabbitmq·java-rabbitmq
七夜zippoe6 小时前
分布式系统实战经验
java·分布式
nomi-糯米7 小时前
Fisco Bcos 2.11.0配置console控制台2.10.0及部署调用智能合约
分布式·网络安全·区块链·智能合约·分布式账本
喜欢猪猪7 小时前
Kafka是如何保证数据的安全性、可靠性和分区的
分布式·kafka
芊言芊语8 小时前
分布式消息服务Kafka版的详细解析和配置方式
分布式·kafka
Alluxio8 小时前
选择Alluxio来解决AI模型训练场景数据访问的五大理由
大数据·人工智能·分布式·ai·语言模型
武子康8 小时前
大数据-133 - ClickHouse 基础概述 全面了解
java·大数据·分布式·clickhouse·flink·spark
.生产的驴9 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq