Spring Boot 如何实现异步消息处理

news2024/11/24 11:36:51

Spring Boot异步消息处理

在现代应用程序中,异步消息处理是一项至关重要的任务。它可以提高应用程序的性能、可伸缩性和可靠性,同时也可以提供更好的用户体验。Spring Boot提供了多种方式来实现异步消息处理,包括使用Spring AMQP、Spring Kafka和Spring JMS等。本文将介绍如何使用Spring Boot实现异步消息处理,并提供相应的代码示例。

在这里插入图片描述

Spring Boot异步消息处理的好处

在许多应用程序中,处理消息是一项非常耗时的任务。如果在应用程序中直接执行此类任务,可能会导致应用程序变得非常缓慢或不可用。而异步消息处理可以让应用程序在后台执行这些任务,从而使得应用程序能够更加快速和可靠地响应用户请求。

异步消息处理的好处包括:

  • 提高应用程序的性能和可伸缩性。
  • 提高应用程序的可靠性和可用性。
  • 提供更好的用户体验。
  • 支持分布式应用程序的开发和部署。

Spring Boot提供了多种方式来实现异步消息处理,包括使用Spring AMQP、Spring Kafka和Spring JMS等。下面将分别介绍这些方式的实现方法和代码示例。

使用Spring AMQP实现异步消息处理

Spring AMQP是基于RabbitMQ的消息传递框架,它提供了一种简单的方式来实现异步消息处理。下面是一个使用Spring AMQP实现异步消息处理的示例代码:

添加依赖

在Maven中添加以下依赖:

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

创建消息接收者

创建一个消息接收者类,用于接收异步消息:

@Component
public class Receiver {
    @RabbitListener(queues = "myQueue")
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

在上面的示例中,使用@Component注解标记Receiver类,并在receiveMessage方法上使用@RabbitListener注解指定要监听的队列。在receiveMessage方法中,接收到的消息将被打印到控制台上。

创建消息发送者

创建一个消息发送者类,用于发送异步消息:

@Component
public class Sender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend("myQueue", message);
    }
}

在上面的示例中,使用@Component注解标记Sender类,并使用@Autowired注解注入RabbitTemplate。在sendMessage方法中,使用rabbitTemplate对象将消息发送到名为myQueue的队列中。

测试异步消息处理

创建一个测试类,用于测试异步消息处理:

@SpringBootTest
@RunWith(SpringRunner.class)
public class AsyncMessagingTest {
    @Autowired
    private Sender sender;

    @Test
    public void testAsyncMessaging() throws InterruptedException {
        sender.sendMessage("Hello, World!");

        // Wait for the message to be received
        Thread.sleep(5000);
    }
}

在上面的示例中,使用@SpringBootTest注解标记测试类,并使用@Autowired注解注入Sender。在testAsyncMessaging方法中,使用sender对象发送一条消息,并使用Thread.sleep等待5秒钟,以确保消息被接收者正确处理。

使用Spring Kafka实现异步消息处理

Spring Kafka是基于Apache Kafka的消息传递框架,它提供了一种简单的方式来实现异步消息处理。下面是一个使用Spring Kafka实现异步消息处理的示例代码:

添加依赖

在Maven中添加以下依赖:

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

创建消息接收者

创建一个消息接收者类,用于接收异步消息:

@Component
public class Receiver {
    @KafkaListener(topics = "myTopic")
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

在上面的示例中,使用@Component注解标记Receiver类,并在receiveMessage方法上使用@KafkaListener注解指定要监听的主题。在receiveMessage方法中,接收到的消息将被打印到控制台上。

创建消息发送者

创建一个消息发送者类,用于发送异步消息:

@Component
public class Sender {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String message) {
        kafkaTemplate.send("myTopic", message);
    }
}

在上面的示例中,使用@Component注解标记Sender类,并使用@Autowired注解注入KafkaTemplate。在sendMessage方法中,使用kafkaTemplate对象将消息发送到名为myTopic的主题中。

测试异步消息处理

创建一个测试类,用于测试异步消息处理:

@SpringBootTest
@RunWith(SpringRunner.class)
public class AsyncMessagingTest {
    @Autowired
    private Sender sender;

    @Test
    public void testAsyncMessaging() throws InterruptedException {
        sender.sendMessage("Hello, World!");

        // Wait for the message to be received
        Thread.sleep(5000);
    }
}

在上面的示例中,使用@SpringBootTest注解标记测试类,并使用@Autowired注解注入Sender。在testAsyncMessaging方法中,使用sender对象发送一条消息,并使用Thread.sleep等待5秒钟,以确保消息被接收者正确处理。

使用Spring JMS实现异步消息处理

Spring JMS是基于Java MessageService的消息传递框架,它提供了一种简单的方式来实现异步消息处理。下面是一个使用Spring JMS实现异步消息处理的示例代码:

添加依赖

在Maven中添加以下依赖:

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

创建消息接收者

创建一个消息接收者类,用于接收异步消息:

@Component
public class Receiver {
    @JmsListener(destination = "myQueue")
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

在上面的示例中,使用@Component注解标记Receiver类,并在receiveMessage方法上使用@JmsListener注解指定要监听的目的地。在receiveMessage方法中,接收到的消息将被打印到控制台上。

创建消息发送者

创建一个消息发送者类,用于发送异步消息:

@Component
public class Sender {
    @Autowired
    private JmsTemplate jmsTemplate;

    public void sendMessage(String message) {
        jmsTemplate.send("myQueue", session -> session.createTextMessage(message));
    }
}

在上面的示例中,使用@Component注解标记Sender类,并使用@Autowired注解注入JmsTemplate。在sendMessage方法中,使用jmsTemplate对象将消息发送到名为myQueue的目的地中。

测试异步消息处理

创建一个测试类,用于测试异步消息处理:

@SpringBootTest
@RunWith(SpringRunner.class)
public class AsyncMessagingTest {
    @Autowired
    private Sender sender;

    @Test
    public void testAsyncMessaging() throws InterruptedException {
        sender.sendMessage("Hello, World!");

        // Wait for the message to be received
        Thread.sleep(5000);
    }
}

在上面的示例中,使用@SpringBootTest注解标记测试类,并使用@Autowired注解注入Sender。在testAsyncMessaging方法中,使用sender对象发送一条消息,并使用Thread.sleep等待5秒钟,以确保消息被接收者正确处理。

使用@Async注解实现异步方法调用

除了使用消息传递框架来实现异步消息处理之外,Spring Boot还提供了一种简单的方式来实现异步方法调用。它可以使用@Async注解来标记方法,从而让它们在后台线程中执行。下面是一个使用@Async注解实现异步方法调用的示例代码:

添加依赖

在Maven中添加以下依赖:

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

创建异步方法

创建一个异步方法,用于执行异步任务:

@Service
public class AsyncService {
    @Async
    public void asyncMethod() {
        System.out.println("Async method started");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Async method completed");
    }
}

在上面的示例中,使用@Service注解标记AsyncService类,并在asyncMethod方法上使用@Async注解来标记它是一个异步方法。在asyncMethod方法中,打印一个开始的消息,然后等待5秒钟,最后打印一个完成的消息。

调用异步方法

创建一个REST控制器,用于调用异步方法:

@RestController
public class AsyncController {
    @Autowired
    private AsyncService asyncService;

    @GetMapping("/async")
    public String async() {
        asyncService.asyncMethod();
        return "Async method called";
    }
}

在上面的示例中,使用@RestController注解标记AsyncController类,并使用@Autowired注解注入AsyncService。在async方法中,调用asyncService.asyncMethod方法来执行异步任务,并返回一个消息表示异步方法已经被调用。

测试异步方法调用

创建一个测试类,用于测试异步方法调用:

@SpringBootTest
@RunWith(SpringRunner.class)
public class AsyncMethodTest {
    @Autowired
    private AsyncController asyncController;

    @Test
    public void testAsyncMethod() throws InterruptedException {
        String result = asyncController.async();
        System.out.println("Result: " + result);

        // Wait for the async method to complete
        Thread.sleep(10000);
    }
}

在上面的示例中,使用@SpringBootTest注解标记测试类,并使用@Autowired注解注入AsyncController。在testAsyncMethod方法中,使用asyncController对象调用异步方法,并使用Thread.sleep等待10秒钟,以确保异步方法执行完成。最后,将异步方法的返回值打印出来。

总结

本文介绍了如何使用Spring Boot来实现异步消息处理。我们通过使用Spring AMQP、Spring Kafka和Spring JMS等消息传递框架,以及使用@Async注解来标记异步方法,来实现异步任务的执行。这些技术都可以提高应用程序的性能、可伸缩性和可靠性,同时也可以提供更好的用户体验。

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

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

相关文章

【斯歌X捷普】优秀体验官活动:全民开发的样板企业是这样炼成的

3月22日&#xff0c;上海斯歌与捷普共同举办了一场别出心裁的活动——“产品优秀体验官”颁奖典礼&#xff0c;以表彰对业务流程开发做出突出贡献的捷普员工。值得注意的是&#xff0c;获奖的14名流程开发人员中&#xff0c;有7人并非是专业的IT人员&#xff0c;而是来自业务岗…

搜索引擎变天了!谷歌宣布开放「生成式搜索平台」!AI 大模型颠覆搜索体验

作者 | 小戏、兔子酱 搜索引擎&#xff0c;可能真的要变天了&#xff01; Google 终于要迎来它 25 年来最大的改变&#xff0c;谷歌宣布了开始内测开放【生成式搜索平台&#xff08;Search Generative Experience&#xff0c;SGE&#xff09;】&#xff0c;并逐步舍弃那些甚至是…

Linux中与中断相关的内核数据结构

【摘要】本文树妖详细讲解了Linux中与中断相关的内核数据结构及其内部联系。 八、中断相关的数据结构 8.1 irq_desc 用于表示IRQ描述符的结构定义如下&#xff1a;\linux-2.6.32.63\include\linux\irq.h struct irq_desc {unsigned int irq; //中断号unsigned int …

ipad可以使用其他品牌的手写笔吗?2023年电容笔推荐

现在&#xff0c;人们的生活越来越智能化&#xff0c;有些人已经用平板电脑取代了传统的笔记本。我发现用ipad不管是用来画画还是做笔记非常方便&#xff0c;但是苹果Pencil对于大多数人来说都是昂贵的。据我所知&#xff0c;如果仅仅是为了记录&#xff0c;而不是为了画画的话…

他是98年的卷王,我真的玩不过他····

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里…

PKI 基础知识

摘要 本白皮书介绍了加密和公钥基本结构(PKI)的概念和使用 Microsoft Windows 2000 Server 操作系统中的证书服务的基础知识。如果您还不熟悉加密和公钥技术&#xff0c;先阅读本白皮书将有助于理解 Windows 2000 Web 站点上有关这些主题的其它技术白皮书。 引言 Microsoft …

玩转VLAN间路由,教你3个好方法

我的网工朋友大家好啊 在现实网络中&#xff0c;经常会遇到需要跨VLAN相互访问的情况。 很多网工通常会选择一些方法&#xff0c;来实现不同VLAN间主机的相互访问&#xff0c;例如单臂路由。 但是&#xff0c;单臂路由技术中由于存在一些局限性&#xff0c;比如带宽、转发效…

NodeJS基础到入门EXPS⑥

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Express框架 Router路由NEST 方法路由端点使用回调函数数组处理路由使用混合使用函数和函数数组处理路由中间件的分类及用法 1、应用级中间件 2、路…

使用 python 制作自动填写问卷星问卷调查程序

目录 前言环境&#xff1a;代码展示尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 你的问卷星任务还没做完吗&#xff1f;今天教你如何快速把问卷星调查任务给完成。 环境&#xff1a; anaconda5.2.0&#xff08;python3.6.8&#xff09; 编辑器: p…

ASEMI代理KY可控硅BT169的工作原理及应用领域

编辑-Z 本文主要介绍了可控硅BT169的工作原理及其在各个领域的用。首先&#xff0c;我们将详细阐述可控硅BT169的工作原理&#xff0c;包括结构特点、工作过程等&#xff1b;其次&#xff0c;我们将探讨可控硅BT169在家用电器、工业控制、电力电子等领域的应用。 1、可控硅BT1…

RSA加密 多线程读写不安全

转自&#xff1a;&#xff08;一场开源 RSA 库引发的“血案”&#xff09; 导读 RSA 加密算法是一种非对称加密算法&#xff0c;该算法极为可靠&#xff0c;在现有技术条件下&#xff0c;很难破解&#xff0c;因此在软件开发中被广泛使用。你不必担心&#xff0c;本文不会介绍…

如何Debug调试Android程序

当开发过程中遇到一些奇怪的bug&#xff0c;但又迟迟定位不出来原因是什么的时候&#xff0c;最好的解决办法就是调试了。调试允许我们逐行地执行代码&#xff0c;并可以实时观察内存中的数据&#xff0c;从而能够比较轻易地查出问题的原因。总结一下使用Android Studio来调试A…

又双叒添新证书:上海斯歌通过ISO9001和ISO27001认证

近期&#xff0c;上海斯歌顺利通过权威机构审查&#xff0c;正式成为ISO9001质量管理体系和ISO27001信息管理安全体系双重认证企业。 可以说ISO9001及ISO27001的认证&#xff0c;既是斯歌坚持管理标准化、程序化、规范化的成果&#xff1b;也是国际标准化组织&#xff08;ISO&a…

Vue3通透教程【十六】TS自动编译

文章目录 &#x1f31f; 写在前面&#x1f31f; 自动编译&#x1f31f; 编译器的配置文件&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#xff0…

Apache的配置与应用(构建web、日志分割及AWStats分析系统)

Apache的配置与应用 一、构建虚拟Web主机二、httpd服务支持的三种虚拟机类型1、基于域名的虚拟主机2、基于IP地址的虚拟主机3、基于端口的虚拟主机 三、构建web虚拟目录与用户授权限制1、创建用户认证数据文件2、添加用户授权配置3、验证用户访问权限4、在客户机中浏览器访问 四…

F牌独立站都有哪些收款方式?各有什么优缺点?

最近几个月以来&#xff0c;FP独立站的收款支付问题变得非常焦灼&#xff0c;不少跨境卖家忧心忡忡&#xff0c;害怕自己收不了款血本无归。今天&#xff0c;我跟大家介绍几种FP独立站的收款方式&#xff0c;以及解析他们各有哪些优缺点&#xff0c;方便卖家选择。 一、TT电汇 …

Go GPM 调度器介绍

Go GPM 调度器介绍 1 简介 ​ 这几天在学习Go的GPM机制&#xff0c;于是就整理了一下收集的资料分享给大家&#xff0c;文章末尾有原文链接。主要介绍了Go在运行时调度器的基本实现逻辑和演变过程。 ​ 2 什么是Go调度器 ​ Go调度器很轻量也很简单&#xff0c;足以撑起gorout…

数据结构基础-数组

2.1 数组 概述 定义 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识 In computer science, an array is a data structure consisting of a collection of elements (values or v…

在 Linux 中启动时自动启动 Docker 容器的 2 种方法

Docker 是一种流行的容器化平台&#xff0c;允许开发人员将应用程序及其依赖项打包成一个独立的容器&#xff0c;以便在不同环境中运行。在 Linux 系统中&#xff0c;我们可以通过配置来实现在系统启动时自动启动 Docker 容器。本文将详细介绍两种方法&#xff0c;以便您了解如…

软件测试面试了一个00后,让我见识到了什么是内卷届的天花板

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xff0c;他…