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

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

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

相关推荐
jerry6095 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang
古人诚不我欺6 小时前
jmeter常用配置元件介绍总结之分布式压测
分布式·jmeter
星染xr8 小时前
kafka 生产经验——数据积压(消费者如何提高吞吐量)
分布式·kafka
东方巴黎~Sunsiny9 小时前
如何监控Kafka消费者的性能指标?
分布式·kafka
飞升不如收破烂~9 小时前
kafka
分布式·kafka
简 洁 冬冬9 小时前
037 RabbitMQ集群
rabbitmq·集群
龙哥·三年风水10 小时前
群控系统服务端开发模式-应用开发-前端个人信息功能
分布式·vue·群控系统
小码哥呀11 小时前
RabbitMQ集群搭建
分布式·rabbitmq
材料苦逼不会梦到计算机白富美11 小时前
golang分布式缓存项目 Day6 防止缓存击穿
分布式·缓存·golang
Yz987613 小时前
Kafka面试题
大数据·分布式·zookeeper·kafka·big data