当前位置: 首页 > news >正文

springboot框架使用RabbitMQ举例代码

以前分享过一个理论有兴趣的小伙伴可以看下
https://blog.csdn.net/Drug_/article/details/138164180

不多说 还是直接上代码

第一步:引入依赖 可以不指定版本

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

第二步 配置文件

  #配置rabbitMq 服务器rabbitmq:host: ${rabbitmq.rabbitmqHost}port: ${rabbitmq.rabbitmqPort}username: ${rabbitmq.rabbitmqUsername}password: ${rabbitmq.rabbitmqPassword}virtual-host: ${rabbitmq.rabbitmqVhost}connection-timeout: 5000#消费者配置listener:simple:
# 不建议使用 自带的重试配置  因为有几种情况会失效  在网上摘抄的 网友的测试
#  重试机制使用场景:
#  1. 如果是业务代码,比如空指针之类的异常那重试机制其实没什么用
#  2. 代码中不能使用try/catch捕获异常,否则重试机制失效
#  我在消费者 使用了 try 发现 确实失效了  所以 我觉得 需要手动在消费者里累计重试次数    自行处理异常
#        retry:
#          enabled: true  #开启消费者retry重试机制
#          max-attempts: 3  # 最大重试次数
#          multiplier: 2.0 # 重试间隔时间倍数
#          initial-interval: 1000 # 初始重试间隔时间(毫秒)
#          max-interval: 10000 # 最大重试间隔时间(毫秒)acknowledge-mode: manual # 手动确认消息,防止消息丢失 auto manual手动确认模式default-requeue-rejected: true #是否将拒绝的消息重新入队。默认是 true,即拒绝的消息会重新入队。 配合手动确认模式concurrency: 1 #: 消费者线程池的并发数。设置同时处理的消费者数量max-concurrency: 1 #最大并发消费者数量prefetch: 1 # 限制每个消费者一次可以获取的消息数量,防止消息在某个消费者身上发生阻塞#生产者配置
#    publisher-returns: true  # 启用发布者返回模式。设置为 true 启用,确保如果消息无法路由到目标队列,则会返回给生产者。# none: 不启用发布者确认。# correlated: 启用发布者确认并使用 CorrelationData 对象,可以在回调中进行处理。#: 启用简单的发布者确认模式,不带 CorrelationData。
#    publisher-confirm-type: none

第三步定义常量 :

package com.testweb.testweb.rabbitmq.web;/*** User:Json* Date: 2024/9/3**/
public class MqConstant {public static final String TestDirectRouting = "rabbitmq.TestDirectRouting";public static final String TestDirectQueue = "rabbitmq.TestDirectQueue";public static final String TestDirectExchange = "rabbitmq.TestDirectExchange";
}

第四步 消费者定义:

package com.testweb.testweb.rabbitmq.web.consumer;import com.testweb.testweb.rabbitmq.web.MqConstant;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.Header;
import com.rabbitmq.client.Channel;import java.util.HashMap;
import java.util.Map;/*** User:Json* Date: 2024/9/3* 消费者**/
@Configuration
public class TestConsumer {//队列@Beanpublic Queue TestDirectQueue() {Map<String, Object> args = new HashMap<>();args.put("x-ha-policy", "all"); //将队列设置为在集群中的所有节点上都可用return new Queue(MqConstant.TestDirectQueue, true, false, false, args);}@Beanpublic DirectExchange TestDirectExchange() {return new DirectExchange(MqConstant.TestDirectExchange, true, false);}@Beanpublic Binding bindingDirect() {return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with(MqConstant.TestDirectRouting);}@RabbitListener(queues = MqConstant.TestDirectQueue)public void process1(Message testMessage, Channel channel) {// 消息的唯一标识idlong deliveryTag = testMessage.getMessageProperties().getDeliveryTag();//重试次数Integer retryCount =(Integer) testMessage.getMessageProperties().getHeaders().getOrDefault("retryCount", 0);try {// 处理消息的业务逻辑System.out.println("Received order message: " + new String(testMessage.getBody()));//假装异常int a=  1/0;// 手动确认消息// deliveryTag 唯一标识// multiple 是否批量拒绝,true 表示拒绝当前及之前的所有消息,false 表示仅拒绝当前消息channel.basicAck(deliveryTag, false);} catch (Exception e) {if (retryCount < 3) { // 设置最大重试次数try {System.out.println("处理失败,拒绝消息并重新入队 :" + testMessage);MessageProperties messageProperties = new MessageProperties();messageProperties.setHeader("retryCount", retryCount + 1);Message newMessage = new Message(testMessage.getBody(), messageProperties);// 重新入队  未写完channel.basicPublish(MqConstant.TestDirectExchange, MqConstant.TestDirectRouting, null, newMessage.getBody());// 手动确认原消息,防止死循环channel.basicAck(deliveryTag, false);// 处理失败,拒绝消息并重新入队 方式1// 消息标识 deliveryTag,// multiple 是否批量拒绝,true 表示拒绝当前及之前的所有消息,false 表示仅拒绝当前消息,,// requeue  是否将消息重新放回队列,true 表示重新放入队列,false 表示丢弃//    channel.basicNack(deliveryTag, false, true);// 处理失败,拒绝消息并重新入队 方式2// 消息标识 deliveryTag// requeue 是否将消息重新放回队列,true 表示重新放入队列,false 表示丢弃。//channel.basicReject(long deliveryTag, boolean requeue);
//                3. 使用场景
//                basicNack:
//                当你需要拒绝一批消息时,使用 basicNack 是更好的选择,尤其是当你想在消费失败时批量拒绝多条消息。
//                适用于更复杂的场景,比如一次性处理多个未确认的消息。
//                basicReject:
//                当你只想拒绝当前消息时,basicReject 是一个简化的选择。它通常用于更简单的场景,只需处理当前消息即可。
//                适合处理单个消息的拒绝。//如果你在消费者 里 只写了 消息确定 没有写 如果异常后 的处理 默认是不会把消息重新放回队列的} catch (Exception nackException) {System.out.println("重新入队失败!!!");// 处理 nack 失败的情况nackException.printStackTrace();}} else {System.out.println("达到最大重试次数 将消息发送到死信队列或进行其他处理!!!");try {channel.basicReject(deliveryTag, false); // 丢弃消息或转发到死信队列} catch (Exception rejectException) {rejectException.printStackTrace();}}}}}

第五步:生产者

package com.testweb.testweb.rabbitmq.web.producer;import com.testweb.testweb.rabbitmq.web.MqConstant;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** User:Json* Date: 2024/9/3* 生产者**/
@Component
public class TestProducer {@ResourceAmqpTemplate amqpTemplate;public <T> void produce(T payload){amqpTemplate.convertAndSend(MqConstant.TestDirectExchange,MqConstant.TestDirectRouting, payload);}
}

第六步 测试:

package com.testweb.testweb.rabbitmq.web.controller;import com.testweb.testweb.rabbitmq.web.MqConstant;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** User:Json* Date: 2024/9/3**/
@RestController
@RequestMapping("/testMq")
public class TestMqController {@ResourceAmqpTemplate amqpTemplate;@GetMapping("test")@CrossOrigin(origins = "*")public void test(@RequestParam String msg){amqpTemplate.convertAndSend(MqConstant.TestDirectExchange,MqConstant.TestDirectRouting, msg);}}

相关文章:

springboot框架使用RabbitMQ举例代码

以前分享过一个理论有兴趣的小伙伴可以看下 https://blog.csdn.net/Drug_/article/details/138164180 不多说 还是直接上代码 第一步&#xff1a;引入依赖 可以不指定版本 <!-- amqp --><dependency><groupId>org.springframework.boot</groupId…...

Java实现一个延时队列

文章目录 前言正文一、基本概念1.1 延时队列的特点1.2 常见的实现方式 二、Java原生的内存型延时队列2.1 定义延时元素DelayedElement2.2 定义延时队列管理器DelayedQueueManager2.3 消费元素2.4 调试2.5 调试结果2.6 精髓之 DelayQueue.poll() 三、基于Redisson的延时队列3.1 …...

为什么说vue是双向数据流

Vue.js 被称为 双向数据绑定&#xff08;two-way data binding&#xff09;&#xff0c;是因为它支持数据在 视图&#xff08;View&#xff09; 和 模型&#xff08;Model&#xff09; 之间双向流动。这意味着&#xff0c;当 数据变化 时&#xff0c;视图会自动更新&#xff1b…...

创造属于你的 Claude Prompt 和个性化 SVG 卡片|对李继刚老师提示词的浅浅解析与总结

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…...

redis与本地缓存

本地缓存是将数据存储在应用程序所在的本地内存中的缓存方式。既然&#xff0c;已经有了 Redis 可以实现分布式缓存了&#xff0c;为什么还需要本地缓存呢&#xff1f;接下来&#xff0c;我们一起来看。 为什么需要本地缓存&#xff1f; 尽管已经有 Redis 缓存了&#xff0c;但…...

git撤销commit和add

撤销commit git reset --soft HEAD^撤销add git reset .查看状态 git status...

【361】基于springboot的招生宣传管理系统

摘 要 使用旧方法对招生宣传管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在招生宣传管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的招…...

【一些关于Python的信息和帮助】

Python是一种广泛使用的高级编程语言&#xff0c;它的设计哲学强调代码的可读性和简洁的语法&#xff08;尤其是使用空格缩进划分代码块&#xff0c;而不是使用大括号或关键字&#xff09;。Python支持多种编程范式&#xff0c;包括面向对象、命令式、函数式和过程式编程。 以…...

creo toolkit二次开发学习之程序集(ProAsmcomp)和装配体组件路径对象(ProAsmcomppath)

程序集ProAsmcomp可以理解为装配体组件对象。 对象ProAssembly是ProSolid的一个实例&#xff0c;并共享相同的声明。因此&#xff0c;ProAssembly对象可以作为适用于装配体的任何ProSolid和ProMdl函数的输入。特别是&#xff0c;因为你可以使用函数ProSolidFeatVisit()来遍历特…...

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…...

外包干了三年,精神严重内耗...

前段时间我同事&#xff08;做测试的一个妹子&#xff09;跟我讲&#xff0c;感觉早上起来十分的疲惫&#xff0c;不想上班&#xff0c;问我们这是什么样的现象&#xff0c;其实有时候我也有这种感觉&#xff0c;虽然我卷&#xff0c;但我也是肉体凡胎啊&#xff01;不是机器人…...

ruoyi-vue集成tianai-captcha验证码

后端代码 官方使用demo文档&#xff1a;http://doc.captcha.tianai.cloud/#%E4%BD%BF%E7%94%A8demo 我的完整代码&#xff1a;https://gitee.com/Min-Duck/RuoYi-Vue.git 主pom.xml 加入依赖 <!-- 滑块验证码 --><dependency><groupId>cloud.tianai.captc…...

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本&#xff0c;列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令&#xff1a; pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…...

Ubuntu 20.04 安装 QGC v4.3 开发环境

Ubuntu 20.04 安装 QGC开发环境 1. 准备安装 Qt 5.15.2安装依赖获取源码 2. 编译参考 前言 QGC ( QGroundControl) 是一个开源地面站&#xff0c;基于QT开发的&#xff0c;有跨平台的功能。可以在Windows&#xff0c;Android&#xff0c;MacOS或Linux上运行。它可以将PX4固件加…...

WPF+MVVM案例实战(二十一)- 制作一个侧边弹窗栏(AB类)

文章目录 1、案例效果1、侧边栏分类2、AB类侧边弹窗实现1.文件创建2、样式代码与功能代码实现3、功能代码实现 3 运行效果4、源代码获取 1、案例效果 1、侧边栏分类 A类 &#xff1a;左侧弹出侧边栏B类 &#xff1a;右侧弹出侧边栏C类 &#xff1a;顶部弹出侧边栏D类 &#xf…...

linux中怎样登录mysql数据库

在Linux中登录MySQL数据库&#xff0c;可以使用以下命令&#xff1a; mysql -u username -p 其中&#xff0c;username是你的MySQL用户名。运行该命令后&#xff0c;系统会提示你输入密码。 如果MySQL服务器不在本地主机或者你需要指定不同的端口&#xff0c;可以使用以下命…...

深入理解 Linux 内存管理:free 命令详解

在 Linux 系统中&#xff0c;内存是关键的资源之一&#xff0c;管理和监控内存的使用情况对系统的稳定性和性能至关重要。free 命令是 Linux 中用于查看内存使用情况的重要工具&#xff0c;它可以让我们快速了解系统中物理内存和交换分区&#xff08;Swap&#xff09;的使用状态…...

指针万字超级最强i解析与总结!!!!!

文章目录 1.内存和地址1.1内存1.2究竟该如何理解编址 2.指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2指针变量和解引用操作符&#xff08;*&#xff09;2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引用操作符 2.3 指针变量的大小 3.指针变量类型的意义3.1指…...

告别生硬电子音,这款TTS软件让语音转换更自然动听

Balabolka是一款革新性的文本语音转换工具&#xff0c;为用户提供了极其灵活和个性化的阅读体验。这款软件不仅仅是简单的文字朗读器&#xff0c;更是一个智能的语音助手&#xff0c;能够将各类文本瞬间转化为生动自然的语音输出。 软件的核心优势在于其卓越的文件兼容性和多样…...

CORS(跨域资源共享)和SOP(同源策略)

CORS&#xff08;跨域资源共享&#xff09;和SOP&#xff08;同源策略&#xff09;不是同一个东西&#xff0c;但它们紧密相关&#xff0c;并且常常一起讨论&#xff0c;因为 CORS 是为了解决同源策略带来的跨域问题而引入的。 同源策略&#xff08;Same-Origin Policy&#x…...

从逆向工程到实战:深度解析钉钉本地数据取证与加密对抗

1. 钉钉本地数据存储结构解析 第一次拆解钉钉的数据库文件时&#xff0c;我对着那堆加密的.sqlite文件发了半小时呆。作为国内用户量最大的企业通讯工具&#xff0c;钉钉在数据保护上确实下了狠功夫。Android和iOS两个平台的数据存储方式既有共性又存在微妙差异&#xff0c;这正…...

OpenHarmony 5.0.2 音频驱动适配实战:从ADM配置到耳机/扬声器切换

1. OpenHarmony音频驱动适配背景与问题定位 最近在RK3568平台上适配OpenHarmony 5.0.2的音频功能时&#xff0c;遇到了一个典型问题&#xff1a;使用RK809音频芯片时&#xff0c;耳机可以正常发声&#xff0c;但内置扬声器完全没声音&#xff0c;而且插入耳机后扬声器也不会自动…...

霍尔电流传感器原理与应用全解析

霍尔电流传感器测量原理深度解析 1. 霍尔效应电流测量基础 1.1 霍尔效应原理 霍尔效应是电流测量的基础物理现象&#xff0c;当导体或半导体薄片置于磁场中&#xff0c;并在其两端施加控制电流时&#xff0c;垂直于电流和磁场方向的两侧会产生电势差&#xff0c;这种现象称为…...

高效构建分布式AI智能体系统:AutoGen架构深度解析与实战指南

高效构建分布式AI智能体系统&#xff1a;AutoGen架构深度解析与实战指南 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen AutoGen是一个革命性的多智能体对话框架&#xff0c;专为简化基于大型语言模型…...

MATLAB 2018B语音信号降噪与盲源分离GUI系统,多维滤波技术展示与实时外放体验

2-6 基于matlab 2018B的语音信号降噪和盲源分离GUI界面&#xff0c;包括维纳滤波&#xff0c;小波降噪、高通、低通、带通滤波&#xff0c;及提出的滤波方法。 每个功能均展示降噪前后声音效果并外放出来。 程序已调通&#xff0c;可直接运行。直接双击运行main.m&#xff0c;耳…...

规则直观落地操作指南(零理解成本・照做就生效・效果肉眼可见)

规则直观落地操作指南(零理解成本・照做就生效・效果肉眼可见) 核心原则:所有内容全是「动作指令」,无概念、无术语、无废话;每一步操作都有「即时可验证的落地效果」,不用等项目结束,做完立刻知道有没有用。 一、先锁死 3 条零理解成本操作铁律(必须先遵守,否则所有…...

4步精通Logisim-evolution:面向数字工程师的开源电路设计工具指南

4步精通Logisim-evolution&#xff1a;面向数字工程师的开源电路设计工具指南 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution Logisim-evolution作为一款开源的数字逻辑设…...

新手避坑指南:安捷伦/是德示波器探头选1MΩ还是50Ω?实测对比告诉你差别有多大

示波器探头阻抗选择实战手册&#xff1a;1MΩ与50Ω的黄金法则 第一次接触示波器时&#xff0c;我犯了个低级错误——用1MΩ探头直接测量射频电路&#xff0c;结果不仅波形畸变成锯齿状&#xff0c;还差点烧毁前端放大器。这个价值3000元的教训让我深刻认识到&#xff1a;探头…...

别再死记硬背了!用Python脚本自动解析蓝牙BR/EDR/BLE测试报告(附代码)

用Python解放双手&#xff1a;自动化解析蓝牙测试报告的实战指南 每天面对堆积如山的蓝牙测试报告&#xff0c;你是否已经厌倦了手动整理数据的繁琐&#xff1f;当测试工程师们还在为Excel公式抓耳挠腮时&#xff0c;Python早已准备好了一套自动化解决方案。本文将带你从零开始…...

视觉定位模型Chord实战:基于Qwen2.5-VL,快速搭建多模态目标检测服务

视觉定位模型Chord实战&#xff1a;基于Qwen2.5-VL&#xff0c;快速搭建多模态目标检测服务 1. 项目概述 视觉定位技术正在改变我们与图像交互的方式。Chord模型基于Qwen2.5-VL多模态大模型&#xff0c;能够理解自然语言指令并在图像中精确定位目标对象。想象一下&#xff0c…...