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

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

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

相关推荐
小的~~1 小时前
面试被问分布式锁,我差点语塞…直到搞懂了Redis、ZooKeeper和etcd的“三国杀”
redis·分布式·面试
武科大许志伟2 小时前
从并行进化到分布式进化计算读 A Survey on Distributed Evolutionary Computation
人工智能·分布式·演化计算
国科安芯15 小时前
ASL706S:让 MCU 不再“失忆跑飞“的守护芯片
分布式·单片机·嵌入式硬件·安全·fpga开发·架构
阿无,17 小时前
RabbitMQ面试题
分布式·rabbitmq
盛世宏博智慧档案19 小时前
全国100个分布式机房环境温湿度智能监测系统建设方案
分布式·机房·温湿度
六bring个六20 小时前
分布式设备连接对端失败问题分析
分布式·分布式软总线
天涯明月19931 天前
ray深度研究报告
大数据·人工智能·分布式·ray
Rain的Java大神之路1 天前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
大菠萝爱上小西瓜2 天前
【大数据实战】Spark 2.2.2 完全分布式集群搭建
大数据·分布式·spark
肠畔码农2 天前
深度解析 RocketMQ 消费端限流与重平衡(Rebalance):分布式队列分配与流控防雪崩本质
分布式·rocketmq