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

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

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

相关推荐
ALex_zry17 小时前
Redis Cluster 分布式缓存架构设计与实践
redis·分布式·缓存
为什么不问问神奇的海螺呢丶19 小时前
n9e categraf rabbitmq监控配置
分布式·rabbitmq·ruby
TTBIGDATA1 天前
【Atlas】Atlas Hook 消费 Kafka 报错:GroupAuthorizationException
hadoop·分布式·kafka·ambari·hdp·linq·ranger
m0_687399841 天前
telnet localhost 15672 RabbitMQ “Connection refused“ 错误表示目标主机拒绝了连接请求。
分布式·rabbitmq
陌上丨1 天前
生产环境分布式锁的常见问题和解决方案有哪些?
分布式
新新学长搞科研1 天前
【智慧城市专题IEEE会议】第六届物联网与智慧城市国际学术会议(IoTSC 2026)
人工智能·分布式·科技·物联网·云计算·智慧城市·学术会议
Ronin3051 天前
日志打印和实用 Helper 工具
数据库·sqlite·rabbitmq·文件操作·uuid生成
泡泡以安1 天前
Scrapy分布式爬虫调度器架构设计说明
分布式·爬虫·scrapy·调度器
没有bug.的程序员1 天前
RocketMQ 与 Kafka 深度对垒:分布式消息引擎内核、事务金融级实战与高可用演进指南
java·分布式·kafka·rocketmq·分布式消息·引擎内核·事务金融
上海锟联科技1 天前
250MSPS DAS 在地铁监测中够用吗?——来自上海锟联科技的工程实践
分布式·科技·分布式光纤传感·das解调卡·光频域反射·das