消息传输不丢失:掌握消息中间件的持久化机制

news2024/11/25 2:34:39

当涉及到消息的持久化和重放时,我们可以使用Spring Boot与RabbitMQ来实现这个场景。RabbitMQ支持消息的持久化,以确保在发送和接收过程中消息不会丢失。同时,我们可以使用消息的重放机制,以便在需要时重新发送消息。

首先,我们需要创建一个Spring Boot工程,并添加以下依赖项到pom.xml文件中:

<dependencies>
    <!-- Spring Boot Starter for RabbitMQ -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>

接下来,我们创建一个消息发送者和接收者。首先,我们定义一个消息实体类Message

public class Message implements Serializable {
    private String content;

    // 构造函数、Getter和Setter省略...
}

然后,我们创建一个消息发送者MessageSender

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class MessageSender {
    @Autowired
    private AmqpTemplate amqpTemplate;

    @Bean
    public DirectExchange myExchange() {
        return new DirectExchange("my-exchange"truefalse); // 设置交换器持久化为true
    }

    public void sendMessage(Message message) {
        amqpTemplate.convertAndSend("my-exchange""my-routing-key", message);
        System.out.println("Message sent: " + message.getContent());
    }
}

在上述代码中,我们使用AmqpTemplate来发送消息,并指定交换机名为my-exchange,路由键为my-routing-key

接下来,我们创建一个消息接收者MessageReceiver

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class MessageReceiver {
    @Bean
    public Queue myQueue() {
        return new Queue("my-queue"true); // 设置队列持久化为true
    }

    @RabbitListener(queues = "my-queue")
    public void receiveMessage(Message message) {
        System.out.println("Message received: " + message.getContent());
    }
}

在上述代码中,我们使用@RabbitListener注解来指定监听的队列为my-queue,并定义了一个方法receiveMessage来接收消息。

接下来,我们需要在application.properties文件中添加RabbitMQ的配置:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在这个示例中,我们假设RabbitMQ运行在本地,端口为5672,用户名和密码为guest

现在,我们可以进行测试。我们可以在main方法中调用发送消息的代码:

@SpringBootApplication
public class MessagingApplication implements CommandLineRunner {
    @Autowired
    private MessageSender messageSender;

    public static void main(String[] args) {
        SpringApplication.run(MessagingApplication.classargs);
    }

    @Override
    public void run(String... args) {
        Message message = new Message();
        message.setContent("Hello, RabbitMQ!");

        messageSender.sendMessage(message);
    }
}

在这个示例中,我们创建了一个Message对象,并调用messageSender.sendMessage(message)来发送消息。

运行应用程序后,你应该能够在控制台上看到类似以下输出:

alt

这表明消息已成功发送和接收。

在这个示例中,消息是持久化的,这意味着即使RabbitMQ服务器在发送和接收过程中发生故障,消息也会被保存,并在服务器恢复后重新发送。

本文由 mdnice 多平台发布

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

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

相关文章

leetcode:387. 字符串中的第一个唯一字符(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s "leetcode" 输出: 0示例 2: 输入: s "loveleetcode" 输出: 2示例 3: 输…

1253. 重构 2 行二进制矩阵(力扣)

1253. 重构 2 行二进制矩阵&#xff08;力扣&#xff09; 题目第一种方式分析测试代码运行结果 第二种方式测试代码运行结果 题目 给你一个 2 行 n 列的二进制数组&#xff1a; 矩阵是一个二进制矩阵&#xff0c;这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为…

系统架构设计师-软件工程(1)

一、软件过程模型 &#xff08;1&#xff09;瀑布模型、&#xff08;2&#xff09;V模型【瀑布变种】、&#xff08;3&#xff09;原型模型、 &#xff08;4&#xff09;螺旋模型【原型瀑布】、&#xff08;5&#xff09;构件组装模型/基于构件的开发方法、 &#xff08;…

学习Kotlin~类

类 类的field 类定义的每一个属性&#xff0c;kotlin都会产生一个filed,一个setter(),一个getter()field用来存储属性数据&#xff0c;不能直接定义&#xff0c;kotlin会封装&#xff0c;保护它里面数据&#xff0c;只暴露给getter和setter使用只有可变属性才有setter方法需要…

UNITY3D弹幕游戏,万人同屏解决方案_类萌宠宠之战

先上效果 &#xff08;类萌宠宠之战&#xff09;弹幕游戏&#xff0c;万人同屏解决方案演示 UNITY默认的人物动画显示方案是 SkinnedMeshRenderer 该动画的计算是由CPU计算&#xff08;计算骨骼位置所影响的顶点位置&#xff09; 所以是CPU计算&#xff0c;物体大于2000个时…

Python3,掌握这几种并行处理,轻轻松松提升for循环速度。

并行处理几种方法 1、引言2、并行处理2.1 定义2.2 并行处理优缺点2.3 并行处理的常用库2.4 代码示例2.4.1 multiprocessing2.4.2 concurrent.futures2.4.3 joblib2.4.4 threading 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;你给我讲一讲并行处理呗。 小鱼&#xff1…

Android:datePicker对话框的使用

一、前言&#xff1a;这篇文章是关于DatePickerDialog&#xff0c;点击按钮出现一个日期选择器对话框&#xff0c;通过点击确认把选则的日期显示到文本控件上。 二、上代码 页面布局xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout…

正则表达式回溯引发的生产惨案

文章目录 背景问题原因分析如何解决&#xff1f;chatgpt 3.5GP4的表现未完待续 背景 业务上的一个字段在解析时为了避免脏数据导致后续ETL的异常&#xff0c;决定从源头将该字段严格按照设计的规则去匹配。该字段的上传是设备端传上来的文件中的一个字段。 正向&#xff1f;反…

「C/C++」C++类与类的关系(UML类图+代码说明)

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C学习 相关术语 &#x1f3af;依赖关系&#xff08;Dependency&#xff09;&#xff1a;表示一个类的实现需要另一个类的协助&#xff0c;虚线箭头&#xff0c;箭头指向被依赖的类。 &#…

基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

2023软科中国大学智能建造专业排名结果出炉(共54所高校)

智能建造专业&#xff08;Intelligent Construction&#xff09;是一个新兴的跨学科领域&#xff0c;它涉及到建筑、土木工程、计算机科学、数据科学等多个学科的知识。智能建造专业专注于研究如何利用先进的计算机技术、人工智能&#xff08;AI&#xff09;、物联网&#xff0…

进销存软件市场成熟,为什么还要用低代码构建?

关键词&#xff1a;进销存软件、群晖NAS、低代码平台 编者按&#xff1a; 进销存管理软件产业已经逐步走向成熟&#xff0c;产品种类也越来越丰富&#xff0c;也正因如此&#xff0c;企业在选择购买进销存软件的时候&#xff0c;往往不知该如何选择。不少的企业会直接选择平台型…

[golang 微服务] 8.go-micro的负载均衡操作,go Web框(Gin,Beego)调用go-micro微服务

一.先创建go-micro服务端 启动consul 需要先启动consul, consol相关内容见 [golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群 [golang 微服务] 6. GRPC微服务集群Consul集群grpc-consul-resolver案例演示 启动consul命令,这里,使用dev模式: consul agen…

手机上怎么压缩视频?教你几招手机压缩视频小技巧

压缩视频是一种有益的技术&#xff0c;可以帮助人们在存储、传输和观看视频时更有效率和便捷。尤其是在现今数字化信息时代&#xff0c;视频已经成为人们日常生活中不可或缺的一部分&#xff0c;因此更需要使用视频压缩技术来更好地管理和使用这些视频文件。下面给大家分享几种…

Yolov8优化: 多分支卷积模块RFB,扩大感受野提升小目标检测精度

1.RFB-Net介绍 论文&#xff1a;https://arxiv.org/pdf/1711.07767.pdf 代码&#xff1a;GitHub - GOATmessi7/RFBNet: Receptive Field Block Net for Accurate and Fast Object Detection, ECCV 2018 受启发于人类视觉的Receptive Fields结构&#xff0c;本文提出RFB&#xf…

3.1 C++纯虚函数

C 纯虚函数 C的纯虚函数是一种特殊的虚函数&#xff0c;没有函数体&#xff0c;只有函数原型。 纯虚函数语法格式为&#xff1a; 等号后面的 0 表示该函数为纯虚函数。 纯虚函数在抽象类中定义&#xff0c;抽象类是指包含至少一个纯虚函数的类&#xff0c;不能被实例化。 …

bim在建筑工程中的应用有哪些?

BIM以其在协同设计、冲突检测、可视化沟通、项目控制和可持续性设计等方面的应用&#xff0c;提高了建筑工程的效率、质量和可持续性&#xff0c;为各利益相关者带来了诸多益处。它已逐渐成为现代建筑工程不可或缺的重要工具和方法。BIM在建筑工程的作用越来越明显。 ​  BIM…

HOT29-删除链表的倒数第 N 个结点

leetcode原题链接&#xff1a;删除链表的倒数第 N 个结点 题目描述 删除链表的倒数第 N 个结点。 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,…

伦敦金k线图基础知识有多重要?

正所谓万丈高楼平地起&#xff0c;不积跬步无以至千里&#xff0c;在投资市场上也才如此&#xff0c;从来没有投资者能够在伦敦金市场上一蹴而就地取得成功&#xff0c;很多成功的交易者都是一步一个脚印&#xff0c;从最基础知识开始学起&#xff0c;逐渐成为专业的投资者。 看…

新星计划2023【Java基础及数据库Mysql】学习方向报名入口!

新星计划2023【Java基础及数据库Mysql】学习方向报名入口&#xff01; 一、关于本学习方向导师二、关于本学习方向官方微信群三、关于活动时间&奖品&要求四、学习计划五、TOP5评选规则六、活动要求七、注意事项 本赛道是针对那些希望从事Java开发并且想要学习如何与数据…