windows下安装rabbitMQ并开通管理界面和允许远程访问

news2024/11/18 7:52:49

如题,在windows下安装一个rabbitMQ server;然后用浏览器访问其管理界面;由于rabbitMQ的默认账号guest默认只能本机访问,因此需要设置允许其他机器远程访问。这跟mysql的思路很像,默认只能本地访问,要远程访问需要另外设置,并且应该是新增一个账号来支持远程。这种做法一下子看上去很奇怪,数据库、消息队列天然就是要大家共同使用的,只能本机使用有什么意义?但细想好像又没有什么毛病,虽然有点不方便,但安全意识是有了。

以下是我初次在项目中使用rabbitMQ的一点记录。

一、安装

在windows下,当然就是下载windows的安装包。但rabbitMQ依赖一种叫ErLang的东东,安装时会先检查。如果没有的话,还要去下载erlang。这破东西100多兆,比rabbitMQ的安装包大多了。喧宾夺主。
在这里插入图片描述
先安装erlang(就是这个otp_win64_**.exe),然后再安装rabbitmq。

二、开通管理界面

安装好rabbitmq之后,会自动在windows里创建一个服务。

安装过程中,可知rabbitMQ有两个默认端口:5672和15672。5672用于编码,15672用于管理界面。

在这里插入图片描述
但是rabbitmq也并不默认打开这个管理界面,需要额外设置:

1、打开RabbitMQ的安装路径的sbin目录,

比如
在这里插入图片描述

2、键入cmd,打开命令窗口

3、输入命令:

rabbitmq-plugins.bat enable rabbitmq_management

即可用浏览器访问管理界面。如前所示。

三、允许远程访问

至此rabbitMQ只能本机访问,比如用账号guest/guest。设置允许远程访问步骤如下:

1、创建一个新账号

当然也可以设置guest允许远程访问,但这不符合安全思想。
在这里插入图片描述

2、给新账号赋权限

1)点击新建的账号
在这里插入图片描述
2)这2个按钮都点一下
在这里插入图片描述
3)有权限了
在这里插入图片描述

3、重启rabbitMQ服务

四、java写入示例

如果每次访问rabbitMQ,都需要连接一次,开销太大,因此使用连接池,每次用完放回池中,用于下次再用。

1、rabbitMQ连接池

<!--rabbitMQ-->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.17.0</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.time.Duration;

/**
 * 连接池
 * 提高性能,不必每次发送消息都构建连接
 */
@Component
public class RabbitMQConnectionPool {
    private static ObjectPool<Connection> pool;

    @Value(value = "${rabbitmq.host:localhost}")
    private String host;
    @Value(value = "${rabbitmq.port:5672}")
    private int port;
    @Value(value = "${rabbitmq.username:guest}")
    private String username;
    @Value(value = "${rabbitmq.password:guest}")
    private String password;

    public RabbitMQConnectionPool() {
        initializePool();
    }

    public Connection getConnection() {
        try {
            return pool.borrowObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //返回连接到连接池
    public void returnConnection(Connection connection) {
        if (connection != null) {
            try {
                pool.returnObject(connection); // 直接返回连接
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @PostConstruct
    private void initializePool() {
        try {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost(host);
            factory.setPort(port);
            factory.setUsername(username);
            factory.setPassword(password);
            factory.setConnectionTimeout(30000); // 设置连接超时
            factory.setRequestedHeartbeat(60); // 设置心跳

            GenericObjectPoolConfig<Connection> config = new GenericObjectPoolConfig<>();
            config.setMaxTotal(10); // 设置最大连接数
            config.setMinIdle(2);   // 设置最小空闲连接数
            config.setBlockWhenExhausted(true); // 允许在连接池耗尽时等待
            config.setMaxWait(Duration.ofMillis(10000)); // 设置最大等待时间

            pool = new GenericObjectPool<>(new BasePooledObjectFactory<Connection>() {
                @Override
                public Connection create() throws Exception {
                    return factory.newConnection();
                }

                @Override
                public void destroyObject(PooledObject<Connection> pooledObject) throws Exception {
                    Connection conn = pooledObject.getObject();
                    if (conn != null) {
                        conn.close();
                    }
                }

                @Override
                public boolean validateObject(PooledObject<Connection> pooledObject) {
                    Connection conn = pooledObject.getObject();
                    return conn != null && conn.isOpen();
                }

                @Override
                public PooledObject<Connection> wrap(Connection conn) {
                    return new DefaultPooledObject<>(conn);
                }
            },config);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、发送处理器

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 发送类,外部可调用其中的发送方法
 */
@Component
public class RabbitMQSender {

    @Autowired
    private RabbitMQConnectionPool connectionPool;

    private final int MaxRetries = 5; // 最大重试次数

    public boolean sendMessage(String queueName, String message){
        return sendMessage(queueName,message,null);
    }
    /**
     * category:业务类型
     *
     * 发送时如果连接失败,自动重连,直至成功或重连次数超标
     */
    public boolean sendMessage(String queueName, String message,String category) {
        boolean ok = true;

        int attempt = 0;

        while (attempt < MaxRetries) {
            /**
             * 定义:Channel 是在一个 Connection 上创建的虚拟连接。
             * 作用:通道用于实际的消息传递操作,包括发送和接收消息、声明队列、交换机等。
             * 连接是底层的 TCP 连接,而通道是基于连接的轻量级虚拟连接,用于处理具体的消息传递操作。
             * 使用连接池来复用 Connection,同时为每个操作创建和关闭 Channel,可以提高性能和资源利用率。
             */
            Connection connection = null;
            Channel channel = null;
            try {
                connection = connectionPool.getConnection();
                if (connection == null) {
                    System.out.println("Failed to get connection, retrying...");
                    attempt++;
                    Thread.sleep(1000); // 等待一段时间后重试
                    continue;
                }

                channel = connection.createChannel();
                channel.queueDeclare(queueName, false, false, false, null);
                channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
                System.out.println(String.format(" [%s] Sent to '%s',length:%d", category != null ? category : "x",
                        queueName, message.length()));
                break; // 发送成功后退出循环
            } catch (Exception e) {
                attempt++;
                System.out.println("An error occurred, retrying...");
                e.printStackTrace();
            } finally {
                // 确保通道和连接在这里被关闭
                try {
                    if (channel != null) {
                        channel.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (connection != null) {
                    // 返回连接到连接池,而不是关闭它
                    connectionPool.returnConnection(connection);
                }
            }
        }

        if (attempt >= MaxRetries) {
            ok = false;
            System.out.println("Failed to send message after " + MaxRetries + " attempts.");
        }

        return ok;
    }
}

3、调用示例

@Autowired
private RabbitMQSender rabbitMQSender;

if (!rabbitMQSender.sendMessage(QueueName, jsonStr, "测试信息")) {
    System.err.println("发送测试信息失败");
}

参考文章
Windows下开启rabbitMQ的图形界面
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置

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

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

相关文章

《深度学习》OpenCV 图像拼接 拼接原理、参数解析、案例实现

目录 一、图像拼接 1、直接看案例 图1与图2展示&#xff1a; 合并完结果&#xff1a; 2、什么是图像拼接 3、图像拼接步骤 1&#xff09;加载图像 2&#xff09;特征点检测与描述 3&#xff09;特征点匹配 4&#xff09;图像配准 5&#xff09;图像变换和拼接 6&am…

鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号

本文将通过BasicMessageChannel获取app版本号&#xff0c;以此来演练BasicMessageChannel用法。 建立channel flutter代码&#xff1a; //建立通道 BasicMessageChannel basicMessageChannel BasicMessageChannel("com.xmg.basicMessageChannel",StringCodec());…

系统工程 > 霍尔三维结构

简介 霍尔三维结构模型是由美国系统工程专家霍尔&#xff08;A.D.Hall&#xff09;在1969年提出的一种系统工程方法论&#xff0c;它集中体现了系统工程方法的系统化、综合化、最优化、程序化和标准化等特点 。该模型将系统工程整个活动过程分为前后紧密衔接的七个阶段和七个步…

MySQL的驱动安装

1、下载并安装MySQL 下载地址&#xff1a; 建议在下列框中选择LTS长期支持版本&#xff0c;下载对应的MSI安装文件。 安装完成后&#xff0c;将MySQL的环境bin路径添加到环境变量中。 可以运行MySQL Configurator进行配置&#xff0c;主要设置密码&#xff0c;并初始化。其余…

机器学习课程学习周报十四

机器学习课程学习周报十四 文章目录 机器学习课程学习周报十四摘要Abstract一、机器学习部分1. EM算法与高斯混合模型2. 概率论复习&#xff08;三&#xff09; 总结 摘要 本周的学习重点是EM算法与高斯混合模型的应用。单高斯模型无法有效拟合多峰数据分布&#xff0c;因此引…

论文精读:拓扑超导体PdBi2Te4和PdBi2Te5计算

npj Computational Materials (2023) 9:188 ; https://doi.org/10.1038/s41524-023-01144-y 摘要节选 超导拓扑金属(SCTMs)近年来成为一种很有前途的量子计算拓扑超导(TSC)和马约拉纳零模式平台。 本文提出了一种通过将超导单元嵌入到拓扑绝缘体中来设计sctm的策略。还编制了…

二叉树的中序遍历(java)

概述 关于二叉树&#xff0c;我们都不陌生&#xff0c;许多基于递归的问题发起点都是一个二叉树的root节点。对于各种二叉树的问题&#xff0c;我们也是通过dfs进行求解。例如求二叉树的深度、最近公共祖先等 算法分析 关于二叉树的中序遍历&#xff0c;我们都知道应该先访…

无人机之集群路径规划篇

无人机的集群路径规划是一个复杂而重要的任务&#xff0c;它要求为一群无人机设计出既安全又高效的飞行路径&#xff0c;同时考虑到多种约束条件和目标。 一、路径规划的重要性 无人机集群路径规划对于确保无人机能够安全、高效地完成任务至关重要。通过合理的路径规划&#x…

Word办公自动化的一些方法

1.Word部分内容介绍 word本身是带有格式的一种文档&#xff0c;有人说它本质是XML&#xff0c;所以一定要充分利用标记了【样式】的特性来迅速调整【格式】&#xff0c;从而专心编辑文档内容本身。 样式&#xff08;集&#xff09; 编号&#xff08;多级关联样式编号&#xff…

企业如何提升知识产权管理效率?

随着企业规模的扩大和创新活动的增加&#xff0c;知识产权管理日益复杂。有效的知识产权管理不仅能够保护企业的创新成果&#xff0c;还能为企业带来巨大的商业价值。然而&#xff0c;许多企业在知识产权管理方面面临着效率低下的问题&#xff0c;管理效率的提升成为企业亟需解…

XSS | 存储型 XSS 攻击

关注这个漏洞的其他相关笔记&#xff1a;XSS 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;存储型 XSS —— 理论篇 存储型 XSS 又称持久型 XSS&#xff0c;攻击脚本将被永久的存放在目标服务器的数据库或文件中&#xff0c;具有很高的隐蔽性。 常见的攻击方式&#xff1a; 这种…

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件&#xff01;阅读帖子直到最后&#xff0c;了解如何做到这一点。 为了获得安全更新并使用最新的操作系统&#xff0c;人们会升级到最新版本的 Windows。然而&#xff0c;在这样做的过程中&#xff0c;许多人丢失了他们的重要文件&#…

Dynamics 365 dependency EntityType

导解决方案时经常会碰到组件依赖导致导入报错&#xff0c;而错误提示中组件只有type, 比如下图中的type 20和60, 初看之下并不知道是什么意思&#xff0c;从parentDisplayName能看出来&#xff0c;这个parent是个实体&#xff0c;但实体中的什么呢&#xff0c;目测是看不出来的…

8621 二分查找

**思路&#xff1a;** 1. 读取输入的元素个数 n。 2. 读取有序数组 ST。 3. 读取要查找的关键字 key。 4. 使用折半查找法&#xff08;即二分查找&#xff09;在数组 ST 中查找 key 的位置。 5. 如果找到 key&#xff0c;输出其位置&#xff1b;如果未找到&#xff0c;输出 &qu…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词&#xff1a;h5离线包加载、h5离线包更新、沙箱 在上一篇文章中&#xff0c;我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下&#xff0c;那么该篇文章将介绍如何加载该沙箱目录下的文件资源&#xff08;此处以打包后的web资源为例&#xff09;&#xf…

5.模拟电子技术笔记——放大电路的分析方法

写在前面 这个是模电的第五次笔记&#xff0c;祝大家学习愉快&#xff01; 笔记部分 1.图解法 我们这节的所有电路都默认是共射放大电路&#xff0c;后面如果没有特殊说明都是共射极的。 1.1 静态工作点的图解分析 我们接下来画出这个电路的直流回路 我们先考察它的输入回…

【redis-04】Redisson实现分布式锁实战和源码剖析

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

ubuntu切换源方式记录(清华源、中科大源、阿里源)

文章目录 前言一、中科大源二、清华源三、阿里源 前言 记录ubunut切换各个源的方式。 备注&#xff1a;更换源之后使用sudo apt-get update更新索引。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、中科大源 地址&#xff1a;https://mirrors.u…

【Golang】Go语言字符串处理库--strings

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

RK3588主板PCB设计学习(一)

DCDC电路可以直接参考数据手册&#xff1a; 电源输出3A&#xff0c;回流GND也应该是3A&#xff0c;回流路径和输出路径的电流是一致的&#xff0c;不要输出路径布线很粗&#xff0c;GND回流路径很细&#xff0c;并且应该保证回流面积最小&#xff1a; 这一点讲的很到位&#xf…