Spring Boot 集成 RabbitMQ(二)

什么是Spring Boot:

Spring Boot是Spring Framework的简化版,其目标是使用尽可能少的配置来简化Spring应用的开发、部署和维护。它根据项目的依赖关系自动配置Spring环境,开箱即用。

什么是RabbitMQ:

RabbitMQ是一种开源的、实现了高级消息队列协议(AMQP)的、可靠的消息队列系统,它旨在支持复杂的事务处理和强大的消息模型。

为什么要将Spring Boot集成RabbitMQ:

Spring Boot集成RabbitMQ后,可以充分利用RabbitMQ的消息队列特性,实现异步处理、流量削峰、解耦等功能,可以有效地提升系统的延展性和稳定性。

Spring Boot基础:

Spring Boot有许多方便的特性,如无需部署、独立运行、内嵌服务器等,这些都可以使开发人员专注于编写业务逻辑。Spring Boot还提供了许多“starter”依赖包,方便进行项目的依赖管理。

Spring Boot的基本使用:

Spring Boot的基本使用包括创建Spring Boot项目,配置Spring Boot属性,创建Controler、Service、Dao等类进行开发,运行Spring Boot项目等。

Spring Boot项目实战:创建一个简单的Spring Boot应用:

创建一个简单的Spring Boot应用通常可以由Spring Initializr工具进行项目的初始化,进行相关配置。

RabbitMQ基础:

RabbitMQ的基本工作流程是生产者发出消息,通过交换机(Exchange)分配到多个队列中,然后交给一个或多个消费者进行处理。

RabbitMQ的Exchange类型和队列绑定:

RabbitMQ有四种Exchange类型:Direct(直接)、Fanout(扇出)、Topic(主题)、Headers(头部),每种类型对应不同的路由策略。而队列绑定则是将某个队列和某个交换器绑定起来。

Spring Boot集成RabbitMQ:

Spring Boot与RabbitMQ的集成方法:

可以使用Spring Boot的"spring-boot-starter-amqp" 来进行RabbitMQ的集成。其主要步骤包括:

  • 在Spring Boot的pom.xml文件中添加相关依赖。
  • 在application.properties中添加RabbitMQ的连接信息,如主机名、端口、用户名和密码等。

创建Spring Boot与RabbitMQ的项目框架:

在创建好Spring Boot项目后,可以添加RabbitMQ相关的配置类,这个配置类给出了如何连接RabbitMQ,并定义了消息队列、交换器和绑定。

配置RabbitMQ连接和消息队列:

在配置文件中配置RabbitMQ连接信息,然后在配置类中设置队列,交换器,绑定(如果需要)。

发布和接收消息:

  • 发布消息:创建一个用于发布消息到特定队列的消息发送类。
  • 接收消息:创建一个监听特定队列并处理消息的消息接收类。

Spring Boot和RabbitMQ进阶特性:

消息确认和消息持久化:

Spring Boot支持消息的确认和持久化,分别可以确保消息不会在处理过程中丢失,并且即使RabbitMQ服务重启,消息也能从磁盘中恢复。

死信队列和延迟队列:

死信队列用于存放无法处理的消息,延迟队列则用于延迟消息的处理。Spring Boot+RabbitMQ可以设置这两个队列,处理相关问题。

高并发处理:

通过设置RabbitMQ的QoS参数,以及Spring Boot的ConnectionFactory的concurrency参数,可以实现在高并发环境中的效率处理。

Spring Boot和RabbitMQ项目实战:

设计和实现一个实用的Spring Boot和RabbitMQ应用:

一个常见的Spring Boot+RabbitMQ应用为,当有大量请求涌入系统时,将请求数据发送到RabbitMQ,然后由多个消费者在后台进行处理。

分析和解决在项目开发过程中遇到的问题:

这部分主要记录在开发过程中遇到的问题,以及如何解决。如消息未被正确消费等。

项目部署和测试:

最后,项目部署到实际环境,并进行必要的压力测试和功能测试,保证服务的稳定性和可用性。

首先,在Spring Boot的pom.xml文件中添加RabbitMQ的相关依赖:

xml

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

然后在application.properties中添加RabbitMQ的相关配置:

properties

spring.rabbitmq.host=your_host
spring.rabbitmq.port=your_port
spring.rabbitmq.username=your_username
spring.rabbitmq.password=your_password

接着在Java配置文件中创建连接工厂,RabbitTemplate,以及创建消息队列:

java

@Configuration
public class RabbitMqConfiguration {@Beanpublic Queue exampleQueue() {return new Queue("ExampleQueue", false);}@Beanpublic RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {final var rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());return rabbitTemplate;}
}

最后在发送者和接收者类中,我们可以定义消息的发送和接收:

java

@Service
public class MessageSender {private final RabbitTemplate rabbitTemplate;@Autowiredpublic MessageSender(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendToRabbitmq(String message) {this.rabbitTemplate.convertAndSend("ExampleQueue", message);}
}@Service
public class MessageReceiver {@RabbitListener(queues = "ExampleQueue")public void receiveMessageFromRabbitmq(String message) {// 处理接收到的消息}
}

2、处理消息确认和消息持久化

以下是如何在Spring AMQP中实现消息确认和消息持久化的示例:

java

@RabbitListener(queues = "queue_name")
public void receiveMessage(Message message, Channel channel) throws IOException {try {// 同步处理消息System.out.println(new String(message.getBody()));// 确认一条消息已经被消费channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {// 如果报错,消息会被重新发送给brokerchannel.basicReject(message.getMessageProperties().getDeliveryTag(), true);}
}

同时,在声明Queue和Exchange时,可以设置其durable属性为true来持久化它们:

java

@Bean
public Queue durableQueue() {return new Queue("durableQueue", true);
}@Bean
public Exchange durableExchange() {return new DirectExchange("durableExchange", true, false);
}

处理死信队列和延迟队列

以下是如何在Spring AMQP中声明死信队列,并设置消息的过期时间来实现延迟队列:

java

@Bean
public Queue deadLetterQueue() {return new Queue("deadLetterQueue", true);
}@Bean
public Queue delayQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", "");args.put("x-dead-letter-routing-key", "deadLetterQueue");args.put("x-message-ttl", 5000);  // 设置消息过期时间为5秒return new Queue("delayQueue", true, false, false, args);
}

以上代码会在消息被发送到delayQueue后,如果5秒内没有被消费,消息会被发送到deadLetterQueue

 

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

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

相关文章

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统&#xff08;https://github.com/netcccyun/dnsmgr&#xff09;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的…

vscode+anaconda 环境python环境

环境说明&#xff1a; windows 10 vscodeanaconda anaconda 安装&#xff1a; 1、官网下载地址:Free Download | Anaconda 2、安装 接受协议&#xff0c;选择安装位置&#xff0c;一直next&#xff0c;到下面这一步&#xff0c;上面是将Anaconda 添加至环境变量&#xff0…

社恐!!!

社恐 1. 独自灿烂去吧&#xff0c;不要在乎任何人的眼光&#xff01; 链接: link 在人群中扭扭捏捏&#xff0c;总觉得别人关注自己 其实你看根本无人在意我&#xff0c;对于他们而言我只是他们日常生活中的一个配角。大家都关注着自己&#xff0c;根本不会有人分心来关注我…

linux使用supervisor部署springboot

supervisor 美&#xff1a;[suːpərvaɪzər ] n.监督人;主管人;指导者; Supervisor是一个进程控制系统工具&#xff0c;用于在Linux系统上管理和监控其他进程。它可以启动、停止、重启和监控应用程序或服务&#xff0c;并在其异常退出时自动重启它们。Supervisor通过提供一个…

spring 和spring boot的区别

Spring是一个开源的Java开发框架&#xff0c;旨在简化Java应用程序的开发。它提供了一个综合的编程和配置模型&#xff0c;用于构建各种类型的应用程序&#xff0c;从简单的命令行工具到复杂的企业级Web应用程序。 Spring Boot是Spring框架的一个扩展&#xff0c;旨在简化Spri…

使用阿里云试用Elasticsearch学习:2.2 深入搜索——全文搜索

我们已经介绍了搜索结构化数据的简单应用示例&#xff0c;现在来探寻 全文搜索&#xff08;full-text search&#xff09; &#xff1a;怎样在全文字段中搜索到最相关的文档。 全文搜索两个最重要的方面是&#xff1a; 相关性&#xff08;Relevance&#xff09; 它是评价查询…

idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 配电室后台管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。 前段主要技术 cs…

阿里 Arthas 工具使用

Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加载信…

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第6节(安全类型转换运算符)

8.6 安全类型转换运算符 ​ 正如我们之前所见&#xff0c;子类的语言类型兼容性规则允许你在期望祖先类的地方使用子类。如我所提到的&#xff0c;反向则不可能。 ​ 现在假设TDog类有一个Eat方法&#xff0c;而TAnimal类中不存在此方法。如果变量FMyAnimal引用了一个狗&…

苹果CMSV10整合dplayer播放器增加记忆+P2P播放+自动下一集功能插件详细保姆级教程

1.本站已打包&#xff0c;可以直接下载然后上传到你服务器的苹果CMS网站static/player目录下就可以了&#xff0c;下面是教程 wlm3u8.js代码&#xff1a; MacPlayer.Html <iframe border"0" src"mac<span class"wp_keywordlink"><a hre…

全国航空机场分布矢量数据/旅游景点poi/全国港口码头分布/地铁站分布/火车站分布/POI矢量数据

民用航空机场是指针对包括跑道型机场、表面直升机场、高架直升机场、船上直升机场、直升机水上平台、滑翔机场、水上机场、有人操纵气球施放场以及其他专供民用航空器起降的划定区域。民用航空机场分为通用航空机场和公共运输机场&#xff1b;不包括临时机场和专用机场。 根据中…

SSM项目实战——哈哈音乐(四)前台模块开发

1、项目准备 ①导入依赖和前端资源 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x…

课时86:流程控制_函数基础_函数退出

2.1.2 函数退出 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 我们可以将函数代码块&#xff0c;看成shell脚本内部的小型脚本&#xff0c;所以说函数代码块也会有执行状态返回值。对于函数来说&#xff0c;它通常支持两种种状态返回…

已解决java.lang.NegativeArraySizeException: 负数组大小异常的正确解决方法,亲测有效!!!

已解决java.lang.NegativeArraySizeException: 负数组大小异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查并修正硬编码值 调整计算逻辑 校验变量值 总结 博主v&#xff1a;XiaoMing_Jav…

解决element-plus table组件 fixed=“right“(left)浮动后横向滚动文字穿透的问题

BUG 版本&#xff1a;element-plus 2.6.1 浏览器&#xff1a;360极速浏览器22.1 (Chromium内核) 组件&#xff1a;el-table组件 问题&#xff1a;在头部/尾部浮动加上斑马条纹后&#xff0c;横向滚动存在文字穿透的问题。具体如图&#xff1a; 白色背景行的文字&#xff0c…

反转链表(leetcode 206)

迭代核心逻辑&#xff1a; 原链表的新的下一个结点&#xff0c;作为新反转链表的头结点 代码分析&#xff1a; 初始化prev为nullptr&#xff08;之后是作为反转后链表的最后一个结点&#xff09;&#xff0c; 遍历原链表时保存当前结点的下一个结点&#xff0c;将curr的nex…

蓝桥杯单片机真题实践篇

这里就不完全写思路过程代码什么的&#xff0c;这一篇文章就写我在训练真题中遇到的过程。 &#xff08;呜呜呜&#xff0c;时间不够辣&#xff0c;能做多少算多少吧....&#xff09; 十三届省赛题 问题1&#xff1a;数码管的数字消影不明显 &#xff08;参考&#xff1a;蓝…

【蓝桥杯-单链表-网络寻路】

蓝桥杯-单链表-网络寻路 单链表基本操作操作一&#xff1a;向链表头插入一个数操作二:在第 k个插入的数后插入一个数操作三&#xff1a;删除第 k个插入的数后面的一个数&#xff1b; P8605 [蓝桥杯 2013 国 AC] 网络寻路 单链表基本操作 初始化有关操作 // head 表示头结点的…

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…

GPS经纬度坐标转换

在淘宝买的ATGM336H 用串口工具在室外读取了下面的数据 这些字符串是GPS定位设备输出的NMEA 0183格式的数据。 NMEA 0183是一种用于在船舶、飞机和其他移动设备中传输位置、速度和时间等信息的标准协议。 $BDGSV,39,,,27*62 22:29:38.654 $GNRMC,142939.000,A,3036.7460,K,A*…