高效处理消息:使用Spring Boot实现消息重试机制

news2024/11/25 22:31:05

当涉及到消息发送和接收的可靠性,Spring Boot提供了一些机制来确保消息的可靠传递。其中包括消息确认机制和重试机制。下面是一个示例代码,演示如何在Spring Boot中实现可靠的消息发送和接收。

首先,我们需要配置RabbitMQ的连接信息和相关属性。在application.properties文件中添加以下配置:

# RabbitMQ连接配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# 消息重试配置
spring.rabbitmq.listener.simple.retry.enabled=true
spring.rabbitmq.listener.simple.retry.max-attempts=3
spring.rabbitmq.listener.simple.retry.initial-interval=5000
spring.rabbitmq.listener.simple.retry.multiplier=2

接下来,我们创建队列、一个消息发送者(Producer)和一个消息接收者(Consumer)的示例代码。

定义队列示列代码:

@Configuration
public class RabbitMQConfig {

 @Bean
    public Queue fanout_queue_email() {
        return new Queue("fanout_queue_email");
    }
}

Producer(消息发送者)示例代码:

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

@Component
public class MessageProducer {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public MessageProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend("fanout_queue_sms", message);
        System.out.println("消息发送成功:" + message);
    }
}

在上面的代码中,我们注入了RabbitTemplate对象,它是Spring Boot提供的用于发送消息的工具类。通过调用rabbitTemplate.convertAndSend()方法发送消息到名为fanout_queue_sms的队列

Consumer(消息接收者)示例代码:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class MessageConsumer {

    @RabbitListener(queues = "fanout_queue_sms")
    public void receiveMessage(String message) {
        System.out.println("接收到消息:" + message);
        // 模拟处理消息的业务逻辑
        processMessage(message);
    }

    private void processMessage(String message) {
        // 模拟业务处理耗时
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 手动抛出异常,触发消息重试
        if (message.contains("error")) {
            throw new RuntimeException("处理消息失败");
        }
        System.out.println("消息处理成功:" + message);
    }
}

在上面的代码中,我们使用@RabbitListener注解标记receiveMessage()方法,表示它是一个消息监听器,监听名为fanout_queue_sms的队列。当接收到消息时,会触发receiveMessage()方法进行处理。

processMessage()方法中,我们模拟了业务处理的耗时,并通过手动抛出异常的方式触发消息重试机制。如果消息处理失败,将会抛出运行时异常,触发Spring Boot的重试机制。

调用示例代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MessageApplication {

    public static void main(String[] args) {
        // 启动Spring Boot应用
        ConfigurableApplicationContext context = SpringApplication.run(MessageApplication.classargs);

        // 获取MessageProducer Bean
        MessageProducer producer = context.getBean(MessageProducer.class);

        // 发送消息
        producer.sendMessage("Hello, World!error");
    }
}

运行效果如下:

alt

本文由 mdnice 多平台发布

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

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

相关文章

58 KVM工具使用指南-应用 LibcarePlus 热补丁

文章目录 58 KVM工具使用指南-应用 LibcarePlus 热补丁58.1 前期准备58.2 加载热补丁58.3 查询补丁58.4 卸载热补丁 58 KVM工具使用指南-应用 LibcarePlus 热补丁 本节以原文件 foo.c 和补丁文件 bar.c 为例,介绍 LibcarePlus 热补丁的应用指导。 58.1 前期准备 …

小小面试题之赛马问题

各家大厂面试时都喜欢出一些逻辑题,简单的考验一下应试者的逻辑思维能力。 题目是:现在有64匹赛马和8条赛道,最少需要多少轮比赛才能选出最快的4匹马。 依据现实情况来说,这个问题很好回答。需要经过小组赛,16强赛&am…

王道操作系统学习笔记(2)——进程管理

前言 本文介绍了操作系统中的进程管理,文章中的内容来自B站王道考研操作系统课程,想要完整学习的可以到B站官方看完整版。 二:进程管理 2.1.1:进程的概念、组成、特征 程序:是静态的,就是存放在磁盘里的…

【好书精读】网络是怎样连接的 —— UDP 协议的收发操作

( 该图由我使用 AI 绘制 ) 目录 不需要重发的数据用 UDP 发送更高效 控制用的短数据 音频和视频数据 不需要重发的数据用 UDP 发送更高效 DNS 服务器查询 IP 地址的时候我们用的是 UDP 协议 简单的说就是,TCP之所以复杂,是…

3-css高级特效-1

01-平面转换 简介 作用:为元素添加动态效果,一般与过渡配合使用 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜) 平面转换也叫 2D 转换,属性是 transform 平移 transform: translate(X轴移动距…

Jetpack Compose 入门难点解疑

作者:晴天小庭 近些年声明式布局开发方式逐渐从网页端延展到了手机端,说到底还是声明式太香了,其代码更加清晰、简洁,并且更接近于自然语言的表达方式。这使得代码易于理解和维护,降低了开发人员的心智负担。 谷歌和苹…

【c语言12】字符串函数(strlen,strcmp,strcpy,strcat,strstr,strtok,strerror)

文章目录 一、字符串函数1.1strlen(求字符串长度)1.2strcmp(比较字符串)1.3strcpy(拷贝字符串)1.4strcat(追加字符串)1.5strstr(判断子串)1.6sttok&#xff0…

【C/C++】使用类和对象 封装链表

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

SpringMVC全套详解

1、SpringMVC是什么1.1、MVC定义1.2、MVC和 SpringMVC的关系2.创建SpringMVC项目 2.1、SpringMVC 链接2.2、RequestMapping 注解说明2.3 、 GetMapping 和 PostMapping 3、获取参数3.1、传递单个参数3.2、传递多个参数/表单参数传递3.3、传递对象3.4、后端参数重命名(后端参数映…

C语言笔记-1

文章目录 C 基础语法注意 C 其他知识点编译过程编译器数据模型区别32/64位机器中&#xff0c;各数据类型所占位数assert() 断言&#xff08;宏&#xff09;用法总结与注意事项 C 基础语法 注意 if(a表达式) 判断的就是a的值&#xff0c;而不是判断这个赋值操作的成功与否。 查…

老天如果给我一次重来的机会,我还会选测试

在我们选择测试这行前&#xff0c;想象总是美好&#xff0c;然而现实无比扎心。 在办公环境上 想象中&#xff1a;美女&#xff08;帅哥&#xff09;环绕&#xff0c;前卫时尚&#xff0c;拥有独立办公间&#xff0c;没事转转座椅&#xff0c;偶尔来点咖啡和音乐。 现实中&…

【数据结构与算法C++实现】2、二分查找

原视频为左程云的B站教学 1 在有序数组中查找特定元素 基本思想是通过比较中间元素与目标元素的大小关系&#xff0c;将查找范围缩小一半&#xff0c;直到找到目标元素或查找范围为空为止。 时间复杂度O(logN) 因为比如说数组个数为N16, 最差的情况要分 4 次 ( [ 8 ∣ 8 ] →…

变化太快的Roop项目(版本1.0.1)

文章目录 &#xff08;一&#xff09;版本1.0.1的变化&#xff08;1.1&#xff09;项目依赖&#xff08;1.2&#xff09;模型位置&#xff08;1.3&#xff09;命令行&#xff08;1.4&#xff09;界面UI&#xff08;1.5&#xff09;处理与结果 最早的&#x1f517;接触和介绍&am…

带三维重建和还原功能的医学影像管理系统(pacs)源码

一、概述 它集影像存储服务器、影像诊断工作站及RIS报告系统于一体,主要由图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成&#xff0c; 具有完善的影像数据库管理功能&#xff0c;强大的图像后处理功能&#xff08;三维重…

2-css-3

一 选择器 1 结构伪类选择器 作用&#xff1a;根据元素的结构关系查找元素。 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E元素&#xff08;第一个元素N值为1&#xff09; li:first-child {background-color: green; }2 :…

AgilePLM应用周期性崩溃-问题解决

​ 问题现象 每周六2点左右&#xff0c;AgilePLM应用进程都会崩溃&#xff0c;具体表现为登录Agile应用服务器之后&#xff0c;找不到weblogic应用进程&#xff08;ps -ef | grep java&#xff09;。从服务器所有相关日志中没有找到任何可疑的异常日志。 当天Agile应用重启之…

UDS通信服务解析

InputOutputControlByIdentifier (0x2F)----通过ID对输入输出进行控制 2F的03子功能是"暂时接管控制权" ReadDataByIdentifier(0x2A)—通过ID读取数据或特定器件状态 ClearDiagnosticInformation(0x14)—清除故障诊断信息 UDS规定用FF FF FF表示所有种类的DTC Rou…

技术干货 | 开始使用 Redis

Redis 是一个使用 C 语言编写的开源、BSD 许可、高级的键值存储&#xff0c;。它也被称为数据结构服务器&#xff0c;因为键可以包含字符串、哈希、列表、集合和有序集合。本教程将介绍使用 Redis 所需的基本概念。Navicat Premium 和 Navicat for Redis 现已支持 Redis, 如果你…

【AUTOSAR】AUTOSAR开发工具链(十一)----基于BTC的back to back测试操作说明(3)

四、PowerWindow demon BTB测试 1、对于MBD生成代码&#xff0c;可以通过上文中使用Embeded-Coder的方式添加工程文件&#xff0c;然后切换到back to back 测试模式 2、点击Generate Stimuli Vectors &#xff0c;进入自动生成测试用例 选择测试用例的生成引擎 设置信号的使用…

2021年国赛高教杯数学建模D题连铸切割的在线优化解题全过程文档及程序

2021年国赛高教杯数学建模 D题 连铸切割的在线优化 原题再现 连铸是将钢水变成钢坯的生产过程&#xff0c;具体流程如下&#xff08;图 1&#xff09;&#xff1a; 钢水连续地从中间包浇入结晶器&#xff0c;并按一定的速度从结晶器向下拉出&#xff0c;进入二冷段。钢水经过…