Spring开发实践(二)

news2024/10/8 15:38:38

@EnableAsync@Async 注解的使用方法

@EnableAsync@Async 是Spring框架中的两个注解,用于启用和使用异步方法执行。它们可以帮助你在Spring应用程序中实现异步编程,从而提高应用程序的性能和响应速度。

@EnableAsync

@EnableAsync 注解用于启用Spring的异步方法执行功能。你需要在配置类或主应用程序类上添加这个注解,以便Spring能够扫描并处理 @Async 注解的方法。

@Async

@Async 注解用于标记一个方法为异步方法。当Spring调用这个方法时,它会在一个独立的线程中执行,而不会阻塞调用者的线程。

使用步骤

  1. 启用异步支持:在配置类或主应用程序类上添加 @EnableAsync 注解。
  2. 标记异步方法:在需要异步执行的方法上添加 @Async 注解。

示例代码

1. 启用异步支持

在主应用程序类或配置类上添加 @EnableAsync 注解。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
2. 标记异步方法

在需要异步执行的方法上添加 @Async 注解。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Async
    public void performAsyncTask() {
        // 这个方法将在一个独立的线程中执行
        System.out.println("执行异步任务");
        try {
            Thread.sleep(5000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("异步任务完成");
    }
}
3. 调用异步方法

在其他地方调用异步方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping("/async")
    public String executeAsyncTask() {
        myService.performAsyncTask();
        return "异步任务已提交";
    }
}

注意事项

  1. 返回类型:异步方法可以返回 voidFutureCompletableFuture。如果需要获取异步方法的结果,可以使用 FutureCompletableFuture
@Async
public CompletableFuture<String> performAsyncTaskWithResult() {
    // 这个方法将在一个独立的线程中执行
    System.out.println("执行异步任务");
    try {
        Thread.sleep(5000); // 模拟耗时操作
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return CompletableFuture.completedFuture("异步任务完成");
}
  1. 线程池配置:默认情况下,Spring使用一个简单的线程池来执行异步任务。你可以自定义线程池,以满足特定的性能需求。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }
}
  1. 类级别的 @Async:你也可以在类级别上使用 @Async 注解,表示该类中的所有方法都将异步执行。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
@Async
public class MyService {

    public void performAsyncTask() {
        // 这个方法将在一个独立的线程中执行
        System.out.println("执行异步任务");
    }
}

通过使用 @EnableAsync@Async 注解,你可以轻松地在Spring应用程序中实现异步方法执行,从而提高应用程序的性能和响应速度。

获取异步结果

主线程可以通过 CompletableFuture 的方法来获取异步任务的结果。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping("/async")
    public String executeAsyncTask() throws ExecutionException, InterruptedException {
        // 调用异步方法,立即返回一个 CompletableFuture 对象
        CompletableFuture<String> future = myService.performAsyncTaskWithResult();
        // 主线程不会被阻塞,可以继续执行其他操作
        System.out.println("异步任务已提交");
        // 获取异步任务的结果(会阻塞直到结果可用)
        String result = future.get();
        return result;
    }
}

总结

  • 调用异步方法时:由于 @Async 注解,异步方法将在一个独立的线程中执行,调用该方法的主线程不会被阻塞。
  • 立即返回 CompletableFuture 对象:调用异步方法后,主线程会立即返回一个 CompletableFuture 对象,表示异步任务的结果。
  • 获取结果:主线程可以通过 CompletableFuture 的方法来获取异步任务的结果,而不需要等待异步任务完成。

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

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

相关文章

RABBITMQ的本地测试证书生成脚本

由于小程序要求必须访问wss的接口&#xff0c;因此需要将测试环境也切换到https&#xff0c;看了下官方的文档 RabbitMQ Web STOMP Plugin | RabbitMQ里面有这个信息 然后敲打GPT一阵子&#xff0c;把要求输入几个来回&#xff0c;得到这样一个脚本&#xff1a; generate_cer…

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)

1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈&#x1f62d;&#x1f62d;) 示例图…

FastGPT连接OneAI接入网络模型

文章目录 FastGPT连接OneAI接入网络模型1.准备工作2.开始部署2.1下载 docker-compose.yml2.2修改docker-compose.yml里的参数 3.打开FastGPT添加模型3.1打开OneAPI3.2接入网络模型3.3重启服务 FastGPT连接OneAI接入网络模型 1.准备工作 本文档参考FastGPT的官方文档 主机ip接…

树的结构(b,b+树)

无论线性表&#xff0c;栈还是队列&#xff0c;都是一对一&#xff0c;查询的时候&#xff0c;效率较低&#xff0c;数据量比较的大的情况 1.树的定义 一种数据结构&#xff0c;有层次关系的集合&#xff0c;根朝上&#xff0c;叶朝下 除了根节点外&#xff0c;每个子节点都…

v-model指令详情——04

V-bind 和v-mode的区别和联系&#xff1a; 1.v-bind 和 v-mode 这两个指令都可以完成数据绑定 2.v-bind是单项数据绑定 data>试图 3.v-mode 是双向数据绑定 data<>试图 4.v-bind 可以使用在任何HTML标签当中。v-mode 只能使用在表单元素上例如&#xff1a; inp…

盘一盘3DGS对哪些行业影响最大?

在日新月异的科技时代&#xff0c;每一个新兴技术的诞生都像是宇宙中的新星&#xff0c;以其独特的光芒照亮并改变着世界。3DGS正是这样一项技术&#xff0c;它的出现无疑对传统3D视觉产生了巨大的冲击&#xff0c;也给各行各业带来了巨大的影响。作为CV界的新晋黑马&#xff0…

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

数据结构-二叉搜索树与红黑树

4.二叉搜索树 又叫二叉查找树、有序二叉树、排序二叉树。树中任意一个结点&#xff0c;其左子树的每个节点值都要小于该节点&#xff0c;其右子树的每个节点值都要大于该节点 作用&#xff1a;能够进行快速查找、插入、删除操作 4.1 二叉搜索树的时间复杂度 注&#xff1a;二…

Python基础教学之五:异常处理与文件操作——让程序更健壮

Python基础教学之五&#xff1a;异常处理与文件操作——让程序更健壮 一、异常处理概念 1. 理解异常 异常是程序运行中发生的错误或意外情况&#xff0c;比如除以零、访问不存在的列表元素等。如果不进行处理&#xff0c;异常会导致程序终止运行。在编程过程中&#xff0c;我…

Java语言程序设计——篇三(2)

循环结构 概述1️⃣while循环例题讲解 2️⃣do-while循环例题讲解 &#x1f6a9;while循环与do-while循环区别3️⃣for循环例题讲解 4️⃣循环的嵌套&#x1f3ee;例题讲解 概述 ⭐️Java语言提供了4种循环结构&#xff1a; (1) while循环 (2) do-while循环 (3) for循环 (4)增…

wangEdtior富文本编辑器 结合element使用,博客必备,通俗易懂

效果展示 使用步骤 安装 npm install wangeditor/editor-for-vue --save创建自定义组件 引入组件并注册&#xff0c;使用组件 <template><div style"border: 1px solid #ccc;"><Toolbarstyle"border-bottom: 1px solid #ccc":editor"…

如何使用Vger对已经过身份验证的Jupyter实例进行安全检测

关于Vger Vger是一款功能强大的交互式命令行应用程序&#xff0c;广大研究人员可以利用Vger与已经过身验证的Jupyter实例进行交互&#xff0c;并对其执行人工智能或机器学习方面的安全检测操作。 使用场景 1、作为红队研究人员&#xff0c;当我们寻找到了Jupyter凭证之后&…

经验分享|如何维护自己的大数据信用?

在当今数字化时代&#xff0c;大数据信用成为越来越多人生活中不可或缺的一部分。大数据信用评估是基于个人的信用历史、信用行为、信用记录等信息&#xff0c;对个人信用状况进行综合评估的一种方式。良好的大数据信用可以帮助个人获得更多的金融服务、更高的信用额度、更低的…

一招解决 Windows 文件重命名时后缀名不显示的困扰

在日常使用电脑的过程中&#xff0c;我们经常需要对文件进行重命名。然而&#xff0c;有时你会发现&#xff0c;在 Windows 系统中重命名文件时&#xff0c;默认情况下不会显示文件的扩展名&#xff08;即后缀名&#xff09;&#xff0c;这可能会导致意外地更改文件类型或者混淆…

Flutter开发者必读:sp_util - SharedPreferences的终极解决方案

简介 sp_util 是一个在 Flutter 社区中广泛使用的轻量级、无依赖的 SharedPreferences 封装库。 SharedPreferences 是 Android 和 iOS 平台上用于存储少量数据的简单键值存储系统。 典型场景 sp_util 库在 Flutter 应用开发中的典型使用场景包括但不限于以下几点&#xff…

模块化沙箱:多场景零信任数据安全解决方案

在政企领域&#xff0c;不同场景和用户往往有着层次不一的安全需求。传统的单一安全解决方案已经无法满足这些复杂而多样化的需求&#xff0c;因此&#xff0c;高灵活性和高扩展性的模块化沙箱应运而生。这种新型数据安全产品通过“积木式”的模块组合&#xff0c;能够精确、灵…

Keysight 是德 DSAX93204A 高性能示波器

Keysight 是德 DSAX93204A 高性能示波器 DSAX93204A Infiniium 高性能示波器&#xff1a; 33 GHz 高带宽实时示波器 zui佳的 33 GHz 真正模拟带宽80 GSa/s 采样率&#xff0c;2 通道&#xff1b;40 GSa/s 采样率&#xff0c;4 通道zui深的存储深度――高达 2 Gpts 存储器&am…

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~

怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~ 文章目录 怎么办&#xff1f;我的C盘又爆红了&#xff01;别慌&#xff01;博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…

极客天成ScaleFlash与南大通用数据库兼容互认证

近日&#xff0c;北京极客天成科技有限公司与天津南大通用数据技术股份有限公司完成产品兼容性互认证&#xff0c;测试结果表明&#xff0c;极客天成分布式存储软件[简称NVMatrix]V3.0与南大通用多模多态数据库管理系统[简称GBase 8c]V5产品兼容性良好、运行稳定。 北京极客天成…

第三期书生大模型实战营 第2关 Python 基础知识

第三期书生大模型实战营 第2关 Python 基础知识 第三期书生大模型实战营 第2关 Python 基础知识Python 基础函数定义常见的内置方法replace(old, new)lower()split() 字典dict 使用Python实现词频统计使用VSCode进行调试总结 第三期书生大模型实战营 第2关 Python 基础知识 Hel…