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:控制界面详解 📣📣📣

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

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

相关推荐
LUCIAZZZ2 小时前
说一下分布式组件时钟一致性的解决方案
java·网络·分布式·计算机网络·操作系统·springboot·系统设计
掘金-我是哪吒3 小时前
分布式微服务系统架构第97集:JVM底层原理
jvm·分布式·微服务·架构·系统架构
掘金-我是哪吒5 小时前
分布式微服务系统架构第96集:大型跨境电商JVM调优,MongoDB、Elasticsearch (ES)、Cassandra
jvm·分布式·mongodb·微服务·系统架构
信徒_6 小时前
Kafka 如何保证消息可靠性?
数据库·分布式·kafka
寒9926 小时前
如何保证RabbitMQ消息的可靠传输?
java·分布式·rabbitmq
IT成长日记7 小时前
【Hadoop入门】Hadoop生态圈概述:核心组件与应用场景概述
大数据·hadoop·分布式
三次握手四次挥手7 小时前
Apache Kafka全栈技术解析
分布式·kafka·apache
RainbowSea8 小时前
10. RabbitMQ 负载集群的详细搭建以及“镜像队列”的搭建配置说明
java·消息队列·rabbitmq
RainbowSea8 小时前
9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明
java·消息队列·rabbitmq
小样vvv8 小时前
【面试篇】Kafka
分布式·kafka