springcloud SpringAmqp消息队列 简单使用

news2025/6/9 16:17:22

这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。

前提

如果没有安装RabbitMQ是无法连接成功的!所以前提是你要安装好RabbitMQ。

docker 安装命令

# 拉取docker镜像
docker pull rabbitmq:management

# 创建容器
docker run -id --name=rabbitmq \
-v /home/rabbitmq:/var/lib/rabbitmq \
-p 15672:15672 \
-p 5672:5672 \
-e RABBITMQ_DEFAULT_USER=guest\
-e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management

这里你也可以映射更多接口

  • 4369, 25672 -- erlang 发现口 & 集群端口
  • 5671, 5672 --client 端通信口(RabbitMq 的编程语言客户端连接端口)(AMOP 端口)
  • 15672 -- 管理界面 ui 端口(RabbitMq 管理界面端口)
  • 25672 -- server 间内部通信口(RabbitMq 集群的端口)
  • 61613, 61614 -- STOMP 协议端口
  • 1883, 8883 -- MQTT 协议端口

安装好访问的页面大概这样:

1、引入依赖

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

2、配置yml

spring:
  #消息总线 也可以使用 kafka 参考 spring-cloud-bus 用法
  rabbitmq:
    host: 192.168.10.111
    port: 5672
    virtual-host: /
    username: guest
    password: guest

3、发送消息

@RequiredArgsConstructor
@RequestMapping("/test")
public class AmqpController {

    private final RabbitTemplate rabbitTemplate;
    /** 
    * 简单发送队列消息 
    **/
    @GetMapping("/senMsg")
    public void senMsg(){
        rabbitTemplate.convertAndSend("队列名称","消息");
    }

}

这里会有个坑,如果队列不存在,那这条消息就不会发送成功!可能是为了防止产生一堆无用的队列吧。

所以,我们需要在发送之前先校验下有没有队列,如果没有就给他创建一个


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.RequiredArgsConstructor;
import org.dromara.system.controller.test.config.RabbitmqConfig;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

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

@Component
@RequiredArgsConstructor
public class PanRabbitTemplate {

    private final RabbitTemplate rabbitTemplate;
    private final RabbitmqConfig rabbitmqConfig;

    public void convertAndSend(String queueName,String msg) {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate);
        //如果queueName队列不存在,创建队列
        if (Objects.isNull(rabbitAdmin.getQueueProperties(queueName))) {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost(rabbitmqConfig.getHost());
            factory.setPort(rabbitmqConfig.getPort());
            factory.setUsername(rabbitmqConfig.getUsername());
            factory.setPassword(rabbitmqConfig.getPassword());
            factory.setVirtualHost(rabbitmqConfig.getVirtualHost());
            try {
                // 创建连接
                Connection connection  = factory.newConnection();
                // 创建信道
                Channel channel = connection.createChannel();
                // 创建队列
                channel.queueDeclare(queueName, false, false, false, null);
                // 关闭通联和连接
                channel.close();
                connection.close();
            }catch (IOException e) {
                throw new RuntimeException(e);
            } catch (TimeoutException e) {
                throw new RuntimeException(e);
            }
        }
        rabbitTemplate.convertAndSend(queueName, msg);
    }

}
RabbitmqConfig 类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix="spring.rabbitmq")
public class RabbitmqConfig {
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String virtualHost;
}

4、接收消息


import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class SpringRabbitListener {

    /**
     * 消费者:没有队列就报错
     * @param msg
     */
    @RabbitListener(queues = "queueName1")
    public void onMessage(String msg){
        System.out.println("spring.queue: " + msg);
    }

    /**
     * 消费者:没有队列就自动创建队列
     * @param msg
     */
    @RabbitListener(queuesToDeclare = { @Queue(value = "test.queue",durable = "true", autoDelete = "false") })
    public void onMessage2(String msg)  {
        System.out.println("spring.queue: " + msg);
    }
}

这里注意,如果只是简单的

@RabbitListener(queues = "queueName1")

,如果你的队列里面没有这个队列他会报错,所以还是建议用下面的方式!

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

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

相关文章

Framework开发之IMS逻辑浅析1--关键线程及作用

关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰&#xff0c;写字笔&#xff0c;键盘等)&#xff0c;每种类型都对应一种驱动设备&#xff0c;而每个硬件驱动设备又对应Linux的一个目录文件…

系统思考:跳出症状看全局

明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程&#xff01;通过经典的啤酒游戏经营决策沙盘&#xff0c;一起沉浸式体验如何从全局视角看待问题&#xff0c;发现单点最优并不等于全局最优。 这不仅是一次简单的课程&#xff0c;更是一次洞察系统背后…

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进

最近&#xff0c;AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2&#xff08;具体型号R1-0528&#xff09;。这款基于MIT许可的开源模型&#xff0c;在原版R1的基础上进行了多项令人瞩目的改进&#xff0c;正以其强大的潜…

surfer15安装

安装文件 安装包和破解文件 安装 破解及汉化 打开软件

Python训练营---DAY48

DAY 48 随机函数与广播机制 知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机…

debian12拒绝海外ip连接

确保 nftables 已安装&#xff1a; Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装&#xff1a; sudo apt update sudo apt install nftables启用并启动 nftables 服务 sudo systemctl enable nftables sudo systemctl start nftables下载maxmind数据库 将文件解…

70年使用权的IntelliJ IDEA Ultimate安装教程

安装Java环境 下载Java Development Kit (JDK) 从Oracle官网或OpenJDK。推荐选择JDK 11或更高版本。 运行下载的安装程序&#xff0c;按照提示完成安装。注意记录JDK的安装路径&#xff08;如C:\Program Files\Java\jdk-11.0.15&#xff09;。 配置环境变量&#xff1a; 右键…

MySQL的日志

就相当于人的日记本&#xff0c;记录每天发生的事&#xff0c;可以对数据进行追踪 一、错误日志 也就是存放错误信息的 二、二进制日志-binlog 在低版本的MySQL中&#xff0c;二进制日志是不会默认开启的 存放除了查询语句的其他语句 三、查询日志 查询日志会记录客户端的所…

低功耗高安全:蓝牙模块在安防系统中的应用方案

随着物联网(IoT)和智能家居的快速发展&#xff0c;安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术&#xff0c;凭借其低成本、易部署和智能化管理等优势&#xff0c;在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…

C++定长内存块的实现

内存池 内存池是指程序预先从操作系统 申请一块足够大内存 &#xff0c;此后&#xff0c;当程序中需要申请内存的时候&#xff0c;不是直接向操作系统申请&#xff0c;而是 直接从内存池中获取 &#xff1b; 同理&#xff0c;当 **程序释放内存 **的时候&#xff0c;并不真正将…

Unity使用代码分析Roslyn Analyzers

一、创建项目&#xff08;注意这里不要选netstandard2.1会有报错&#xff09; 二、NuGet上安装Microsoft.CodeAnalysis.CSharp 三、实现[Partial]特性标注的类&#xff0c;结构体&#xff0c;record必须要partial关键字修饰 需要继承DiagnosticAnalyzer 注意一定要加特性Diagn…

大数据CSV导入MySQL

CSV Import MySQL 源码主要特性技术栈快速开始1. 环境要求2. 构建项目3. 使用方式交互式模式命令行模式编程方式使用 核心组件1. CsvService2. DatabaseService3. CsvImportService 数据类型映射性能优化1. 连接池优化2. 批量操作优化3. MySQL配置优化 配置说明application.yml…

MySQL 索引优化(Explain执行计划) 详细讲解

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL 索引优化&#xff08;Explain执行计划…

Cad 反应器 cad c#二次开发

在 AutoCAD C# 二次开发中&#xff0c;DocumentCollectionEventHandler 是一个委托&#xff08;delegate&#xff09;&#xff0c;用于处理与 AutoCAD 文档集合&#xff08;DocumentCollection&#xff09;相关的事件。它属于 AutoCAD .NET API 的事件处理机制&#xff0c;本质…

【websocket】安装与使用

websocket安装与使用 1. 介绍2. 安装3. websocketpp常用接口4. Websocketpp使用4.1 服务端4.2 客户端 1. 介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制。 传统的 web 程序都是属于 “一问一答” 的形式&#xff0c;即客户端给服务器发送…

【大模型】LogRAG:基于检索增强生成的半监督日志异常检测

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计D.1 数据集/评估指标D.2 SOTAD.3 实验结果 E 个人总结E.1 优点E.2 不足 A 论文出处 论文题目&#xff1a;LogRAG: Semi-Supervised Log-based Anomaly Detection with Retrieval-Augmented …

基于SpringBoot实现的大创管理系统设计与实现【源码+文档】

基于SpringBootVue实现的大创管理系统采用前后端分离架构方式&#xff0c;系统设计了管理员、学生、指导老师、院系管理员两种角色&#xff0c;系统实现了用户登录与注册、个人中心、学生管理、指导老师管理、院系管理员管理、优秀项目管理、项目类型管理、项目信息管理、项目申…

国产高云FPGA实现视频采集转UDP以太网输出,FPGA网络摄像头方案,提供2套Gowin工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产高云FPGA基础教程国产高云FPGA相关方案推荐我这里已有的以太网方案 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄…

Webpack依赖

Webpack到底怎么对我们的项目进行打包捏&#xff1f; 在webpack处理应用程序时&#xff0c;会根据命令或者配置文件找到入口文件 从入口开始&#xff0c;会生成一个依赖关系图&#xff0c;这个依赖关系图会包含应用程序中所需的所有模块&#xff08;.js、css文件、图片、字体…

自动驾驶科普(百度Apollo)学习笔记

1. 写在前面 在过去的几年里&#xff0c;自动驾驶技术取得飞速发展&#xff0c;人类社会正逐渐走向一个新时代&#xff0c;这个时代中&#xff0c;汽车不仅仅是一个交通工具&#xff0c;更是一个智能的、能够感知环境、做出决策并自主导航的机器伙伴。现在正好也从事这块的工作…