RabbitMQ 最新版 安装,配置,java接入使用(详细教程)

news2025/1/11 3:56:03

一 RabbitMQ下载

RabbitMQ 官网最新版下载:

RabbitMQ: One broker to queue them all | RabbitMQ

RabbitMQ依赖erlang-26.2.5.2-1.el7.x86_64.rpm下载:

https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.2/erlang-26.2.5.2-1.el7.x86_64.rpm

二 RabbitMQ安装

   1 安装erlang环境

  安装RabbitMQ前要先安装erlang环境,因为RabbitMQ是用erlang开发的

  执行安装指令如下:

rpm -ivh erlang-26.2.5.2-1.el7.x86_64.rpm

   执行后如下图:

  验证 erlang 安装是否成功,执行erl可以查看版本,说明安装成功如下图:

 

2 安装RabbitMQ

  执行安装RabbitMQ指令如下:

rpm -ivh rabbitmq-server-3.13.6-1.el8.noarch.rpm 

  执行安装中,如下图: 

 注意:如果erlang环境没有安装好,或者版本与当前rabbitMQ不匹配则会报错以下错误,提示需要指定范围的依赖版本,如下图: 

如果出现上图的错误,请参考上一步重新安装erlang环境即可。

 安装结束后,消息队列数据保存在哪?日记在哪?想了解更多的信息?

只需一条指令可查询当前状态信息:

rabbitmq-diagnostics status

执行后如下图:

从上图状态中可以看出目前没有使用任何配置文件,以可以看到以下有用的信息:

  • 数据目录: /var/lib/rabbitmq/mnesia/rabbit@server-c868cc62-54b3-4125-80a3-a809f3caff6b
  • 日记文件:/var/log/rabbitmq/rabbit@server-c868cc62-54b3-4125-80a3-a809f3caff6b.log

 上图信息很详细,可以说开发者开发这个工具非常的细心,对软件有足够了解使用也安心!

3 配置RabbitMQ(可选项

  安装好后RabbitMQ没有使用任何的配置文件(也没有默认配置文件),但会生成一个空目录位置在:/etc/rabbitmq/ ,在这里你可以按照自己的需求参考官方网站配置自己的项目,格式支持有多种,下面我这里要变更默认端口为例创建一个配置文件:

vi /etc/rabbitmq/rabbitmq.config

配置文件内容:

[
  {rabbit, [{tcp_listeners, [{"0.0.0.0", 51091}]}]},
  {rabbitmq_management, [
  {listener, [{port,59876}, {ssl, false}]}
  ]}
].

  通过配置配置文件实现变更:

  1.   客户端 51091 用于消费或生产端连接,IP 0.0.0.0 代表绑定服务器内外网IP。
  2.   管理端口 59876 用于RabbitMQ的Web管理。

再次执行 rabbitmq-diagnostics status 查看新增的配置文件是否被使用,如下图:

 上图可以看到刚刚创建的配置文件已被引用状态。

4 RabbitMQ 启动与关闭

   RabbitMQ安装好后最终是服务状态,可以通过服务管理控制:

#启动
systemctl start rabbitmq-server

#停止关闭
systemctl stop rabbitmq-server

#重启
systemctl restart rabbitmq-server

#开机启动
systemctl enable rabbitmq-server

#查看状态
systemctl status rabbitmq-server

  操作如下图:

5 开启RabbitMQ的Web管理界面(可选项,强烈建议开启

RabbitMQ的安装后自带Web管理界面,但是需要执行以下指令开启:

rabbitmq-plugins enable rabbitmq_management

 我们平时只需要一名管员即可,后面要增加用户或设置权限直接在Web操作即可。

   新增一位 RabbitMQ的Web管理员并增加设置管理权限 ,用于管理RabbitMQ.

#新增人员
rabbitmqctl add_user hua abc123uuPP

#设置权限
rabbitmqctl set_permissions -p / hua ".*" ".*" ".*"

#设置为管理员
rabbitmqctl set_user_tags hua administrator

* 表示授予该用户对该虚拟主机上所有队列和交换机的 configurewriteread 权限。

  • 第一个 ".*" 表示用户可以配置任意队列和交换机。
  • 第二个 ".*" 表示用户可以向任意队列和交换机发送消息。
  • 第三个 ".*" 表示用户可以从任意队列中消费消息。

 执行过程如图:

执行上面命令增加一个Web管理员:

  • 用户名称:hua
  • 密码:abc123uuPP
  • 权限 :管理员

  如果只在本地localhost登陆RabbitWeb管理平台,用默认的账号登陆即可:

  • 默认用户:guest
  • 默认密码:guest

三 RabbitMQ Web 管理

1 RabbitMQ Web 登陆

 进入RabbitMQ Web 登陆页面如下:

首先我们使用默认账号密码尝试登陆,为了安全确实限制本地登陆,如下图:

使用上面新建的账号hua登陆,登陆成功如下图:

2 用户管理

 用户管理,用户增加操作简单,如下图:

3 用户权限设置 

   用户管理,用户权限设置操作简单,如下图:

四 java代码接入

  方式一 java通用:

  1 引入mvn依赖

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.20.0</version>
        </dependency>

  JAVA 连接RabbitMQ生产消息与接收消费测试代码:

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

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author hua
 * @date 2024-08-21 18:01
 */
public class TestRabbitMQ {

    private final static String QUEUE_NAME = "hello";

    public static void main1(String[] args) {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("xx.xx.xx.xx");
        factory.setPort(51091);
        factory.setUsername("java_producer");
        factory.setPassword("java_producer");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");

        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    public static void main(String[] argv) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("xx.xx.xx.xx");
        factory.setPort(51091);
        factory.setUsername("java_consumer");
        factory.setPassword("java_consumer");
        // 连接到 RabbitMQ 服务器
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 声明队列(确保队列存在)
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

            // 定义回调函数,当有消息送达时执行
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            };

            // 消费消息
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
        }
    }
}

 测试运行发送消息,发送成功。如下图:

 

 测试运行接收消息,消费成功。如下图:

 上面测试通过后,改成服务类方便生产环境使用来发送消息代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author hua
 * @date 2024-08-22
 */
@Service
public class RabbitMqServiceImpl {

    private static final Logger logger = LogManager.getLogger(RabbitMqServiceImpl.class);

    private static final String QUEUE_NAME = "test";
    private Connection connection;
    private Channel channel;

    public RabbitMqServiceImpl() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("xx.xx.xx.xx");
        factory.setPort(51091);
        factory.setUsername("java_producer");
        factory.setPassword("java_producer");
        //如果不指定虚拟机默认会使用/
        factory.setVirtualHost("test");


        try {
            this.connection = factory.newConnection();
            this.channel = connection.createChannel();
            this.channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            logger.info("RabbitMqServiceImpl initialized successfully.");
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
            logger.error("Failed to initialize RabbitMqServiceImpl: {}", e.getMessage());
            throw new RuntimeException("Failed to initialize RabbitMqServiceImpl", e);
        }
    }

    public void sendMessage(String message) {
        try {
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("Failed to send message: {}", e.getMessage());
        }
    }

    public void close() {
        try {
            if (channel != null && channel.isOpen()) {
                channel.close();
            }
            if (connection != null && connection.isOpen()) {
                connection.close();
            }
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}

方式二 SpringBoot框架使用

mvn依赖包:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

spring配置文件:

Spring: 
 rabbitmq:
    host: xx.xx.xx.xx
    port: 51091
    username: java_consumer
    password: java_consumer
    virtual-host: hellow
    connection-timeout: 6000

JAVA代码:

  发送消息java代码:

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author hua
 * @date 2024-08-22
 */
@Component
public class MessageProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private Queue queue;

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(queue.getName(), message);
        System.out.println(" [x] Sent '" + message + "'");
    }
}

  接收消息java代码:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author hua
 * @date 2024-08-22
 */
@Component
public class RabbitListener {

    private static final Logger logger = LogManager.getLogger(RabbitListener.class);

    @RabbitListener(queues = "test")
    public void receiveMessage(String message) {

        try {
            System.out.println("rabbit rev <- "+message);
            //具体业务
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("rabbit err= ", e);
        }

    }
}

   上面代码在生产发送消息时通过编码方式更灵活,接收直接使用注解更简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Information Processing Technician

信息处理技术员试题 🔥SeptemberZone 1.信息是一种() A.资源 B.物质 C.能量 D.载体 2.以下关于信息的表达中,不正确的选项是() A.一切数据都能产生信息 B.信息的产生、处理和传递依靠于物质和能量 C.同一信息在不同的时间可能具有不同的价值 D.信息的屡次使用不会使信息…

MD编辑器学习笔记

MD编辑器学习笔记 目录标题文本样式列表图片链接代码片数学公式表格部分总结 目录 目录是使用“[TOC](目录&#xff09;”&#xff0c;记住别忘了加上&#xff08;&#xff09;标题 使用#来确定标题&#xff0c;几个#就是几级标题。记住#后面要加上空格文本样式 tips: 在写正…

什么是制造业项目管理软件?适合制造企业的项目管理软件具备哪些特征

当前&#xff0c;我国的制造业呈现出稳步增长与风险并存的现象。经济构建以国内大循环为主体&#xff0c;国产替代的浪潮正在席卷国内制造业&#xff0c;越来越多的制造领域企业开始启动数字化变革来支撑企业的迅猛发展&#xff0c;进一步优化项目管理流程&#xff0c;促进研发…

Docker的概述及如何启动docker的镜像、远程管理宿主机的docker进程

一、概述&#xff1a; 1、Docker 是什么&#xff1f; Docker 是⼀个开源的应⽤容器引擎&#xff0c;可以实现虚拟化&#xff0c;完全采用“沙盒”机制&#xff0c;容器之间不会存在任何接口。 2、Docker 和虚拟机的区别&#xff1a; 1&#xff09;启动速度&#xff1a;Dock…

使用 Visual Studio 编辑器作为 DailyNotes 的 markdown 编辑器

DailyNotes 是我使用过的最优秀的日常笔记管理工具&#xff0c;为它配置一个好的 markdown 编辑器&#xff0c;可以大幅提升效率。 除了使用 Typora 作为 markdown 编辑器&#xff0c;Visual Studio Code 也是一个非常不错的选择&#xff0c;令人惊喜的是&#xff0c;它也支持…

React学习笔记(二)——react基础

目录 1. 受控表单绑定 2. React中获取DOM 3. 案例&#xff1a;B站评论 — 发表评论 3.1 B站评论案例 —— 核心功能实现 3.2 B站评论案例 — id处理和时间处理 3.3 B站评论案例 — 清空内容并重新聚焦 4. 组件通信 4.1 理解组件通信 4.2 父传子-基础实现 4.3 父传子-…

基于Spark计算网络图中节点之间的Jaccard相似性

基于Spark计算网络图中节点之间的Jaccard相似性 Jaccard 相似度是一种较为常用的衡量两个集合相似性的指标&#xff0c;用于计算两个集合的交集与并集的比率。具体来说&#xff0c;它的计算公式为&#xff1a; 在网络图中同样经常使用Jaccard来计算节点之间的相似性&#xff…

【标准知识】航天产品设计文件编号

按照QJ 1714-2011《航天产品设计文件管理制度》&#xff0c;梳理一下设计文件的编号要求。 01 设计文件 按照QJ 1714的规定&#xff0c;设计文件是由设计部门编制的&#xff0c;用以规定产品的组成、型式、结构尺寸、技术要求、原理以及制造、调试、试验、验收、使用、维护、…

Robot Operating System——自定义订阅/发布的消息结构

大纲 初始化环境生成自定义消息的工程创建包自定义消息package.xml完整文件 CMakeLists.txt完整文件 编译注册 使用自定义消息的工程创建包代码CMakeLists.txt编译运行 工程地址参考资料 在之前的案例中我们订阅/发布之间传递的消息都是ROS2的标准类型。本文我们将讨论如何自定…

【IoTDB 线上小课 06】列式写入=时序数据写入性能“利器”?

【IoTDB 视频小课】更新来啦&#xff01;今天已经是第六期了~ 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 列式写入到底是&#xff1f; 上一期我们详细了解了…

【STM32】写Keil程序的注意事项

看正点原子的资料使用Keil写STM32程序的时候&#xff0c;总是在不断学习&#xff0c;不断探索。后续又学到啥再更新 目录 1 Keil设置 1.1 字体设置 1.2 快捷键设置 1.3 快速前往前一操作位置/后一操作位置 2 宏定义 2.1 宏定义函数时为什么使用do{…}w…

DockerHub解决镜像拉取之困

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【数据结构篇】~栈和队列(附源码)

【数据结构篇】~栈和队列 前言一、栈的实现1.头文件2.源文件3.一个算法题——[有效的括号](https://leetcode.cn/problems/valid-parentheses/description/%E2%80%8B) 二、队列1.头文件2.源文件 前言 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入…

极速文件预览!轻松部署 kkFileView 于 Docker 中!

大家好&#xff0c;这几天闲的难受&#xff0c;决定给自己找点事做。博主的项目中有个文件预览的小需求&#xff0c;原有方案是想将文件转换成 PDF 进行预览。本着能借鉴就绝对不自己写的原则。今天就让我们简单试用一下 kkFileView 文件预览服务&#xff0c;一起探索它的强大功…

先导桌面式教育数控 小型数控车床 C59

桌面式教育数控主要指的是在教育领域中使用桌面型数控机床进行教学和培训。这种设备结合了数控技术和小型化设计&#xff0c;使得数控技术的学习和应用变得更加便捷和经济。 桌面式教育数控的主要特点包括&#xff1a; 小型化&#xff1a;机床体积小&#xff0c;重量轻&#x…

Debezium2.7 数据同步 MySQL/Oracle -- AI生成

Debezium是Red Hat开源的一个工具&#xff0c;用于实时捕获多种数据源&#xff08;包括MySQL、PostgreSQL、SQL Server、Oracle等&#xff09;的变更数据&#xff0c;并将这些数据作为事件流输出到Kafka等消息中间件中。通过Debezium&#xff0c;可以实现数据的实时同步和变更数…

Vue组件库Element和Vue路由

目录 一、Vue组件库Element&#xff08;学会怎么CV&#xff09; 快速入门 ElementUI的常用组件 1.Table表格 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff09;组件属性详解 2.Pagination分页 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff0…

易企秀Html5场景秀系统源码 海量模版可以选择 带源代码包以及搭建部署教程

系统概述 易企秀 HTML5 场景秀系统源码是基于 PHPMySQL 组合开发的一套强大的 H5 页面制作系统。它旨在满足企业和个人对于个性化 H5 页面制作的需求&#xff0c;无论是企业宣传、活动推广、产品展示还是邀请函制作等&#xff0c;都能通过该系统轻松实现。 该系统的核心优势在…

智能优化算法-森林优化算法(FOA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 森林优化算法 (Forest Optimization Algorithm, FOA) 是一种基于自然生态系统的元启发式优化算法&#xff0c;它模拟了森林生态系统中的植物生长、竞争和合作等行为&#xff0c;用于解决复杂的优化问题。 FOA的…

uniapp中 使用 VUE3 组合式API 怎么接收上一个页面传递的参数

项目是uniapp &#xff0c;使用了vue3 vite // 使用的组合式API 的 语法糖 <script setup> // 无法使用 onLoad <script> 使用不了下面方法获得上一个页面参数传递 onLoad(options){ } 解决方案1&#xff08;亲测Ok&#xff09;&#xff1a;消息通知与监听…