原来你是这样的SpringBoot--Async异步任务

这篇具有很好参考价值的文章主要介绍了原来你是这样的SpringBoot--Async异步任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量。

一、新建项目,启动异步调用

首先给启动类增加注解@EnableAsync,支持异步调用

@EnableAsync
@SpringBootApplication
public class CathySpringbootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(CathySpringbootDemoApplication.class, args);
    }

}

然后定义要执行的Task,分类增加一个同步方法和异步方法,其中异步方法需要增加注解@Async

@Component
public class AsyncTask {
    /**
     * 异步任务,需要注解@Async
     *
     * @param taskId 任务编号id
     * @param second 执行时长,模拟慢任务
     * @return
     */
    @Async
    public Future<Boolean> asyncExec(int taskId, Long second) {
        exec(taskId, second);
        return new AsyncResult<>(Boolean.TRUE);
    }

    public void exec(int taskId, Long second) {
        System.out.println("开始执行任务" + taskId);
        try {
            Thread.sleep(second * 1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("结束执行任务" + taskId);
    }
}

其实接下来就可以在controller中创建接口来进行简单的测试了

@RestController
@RequestMapping("/async")
public class AsyncController {
    @Autowired
    AsyncTask asyncTask;

    @GetMapping("sync_task")
    public String syncTask() {
        long start = System.currentTimeMillis();
        asyncTask.exec(1, 3L);
        asyncTask.exec(2, 3L);
        asyncTask.exec(3, 3L);
        long time = System.currentTimeMillis() - start;
        return "同步执行,耗时" + time;
    }

    @GetMapping("async_task")
    public String asyncTask() {
        long start = System.currentTimeMillis();
        Future<Boolean> f1 = asyncTask.asyncExec(1, 3L);
        Future<Boolean> f2 = asyncTask.asyncExec(2, 3L);
        Future<Boolean> f3 = asyncTask.asyncExec(3, 3L);
        try {
            f1.get();
            f2.get();
            f3.get();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }

        long time = System.currentTimeMillis() - start;
        return "异步执行,耗时" + time;
    }
}

启动程序,查看接口响应结果:
http://localhost:16001/async/sync_task
原来你是这样的SpringBoot--Async异步任务

http://localhost:16001/async/async_task
原来你是这样的SpringBoot--Async异步任务

注意:异步方法和调用一定要写在不同的类中

二、线程池配置

上面的例子,在耗时服务多的情况下,使用异步方法确实提高了响应速度。但是它默认启用的是Spring默认的线程池SimpleAsyncTaskExecutor,不太灵活。我们把异步请求多增加几次调用看看效果:

@GetMapping("async_task")
    public String asyncTask() {
        long start = System.currentTimeMillis();
        List<Future<Boolean>> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Future<Boolean> fi = asyncTask.asyncExec(i, 10L);
            list.add(fi);
        }
        for (int i = 0; i < 20; i++) {

            list.forEach(x -> {
                try {
                    x.get();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (ExecutionException e) {
                    throw new RuntimeException(e);
                }
            });
        }

        long time = System.currentTimeMillis() - start;
        return "异步执行,耗时" + time;
    }

原来你是这样的SpringBoot--Async异步任务
从上面的运行效果来看,一旦超过8个并行执行的任务,就开始出现等待了。

接下来,我们自定义线程池

@Bean
 public TaskExecutor threadPoolTaskExecutor(){
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
     executor.setCorePoolSize(8);
     executor.setMaxPoolSize(16);
     executor.setQueueCapacity(20);
     executor.setKeepAliveSeconds(30);
     executor.setWaitForTasksToCompleteOnShutdown(true);
     executor.setThreadNamePrefix("task-thread-");
     executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());

     executor.initialize();
     return executor;
 }

然后在异步方法的注解中,明确指定所使用的线程池

@Async("threadPoolTaskExecutor")
    public Future<Boolean> asyncExec(int taskId, Long second) {
        exec(taskId, second);
        return new AsyncResult<>(Boolean.TRUE);
    }

执行效果如下:

原来你是这样的SpringBoot--Async异步任务

原来你是这样的SpringBoot--Async异步任务

可以看出,线程池设置的参数已经生效。


本人公众号[ 敬YES ]同步更新,欢迎大家关注~

原来你是这样的SpringBoot--Async异步任务文章来源地址https://www.toymoban.com/news/detail-671294.html

到了这里,关于原来你是这样的SpringBoot--Async异步任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端常见面试题之异步(event loop, promise, async/await, 宏任务/微任务)

    从前到后,一行一行执行 如果某一行执行报错,则停止下面代码执行 先把同步代码执行完,再执行异步 示例: 输出结果为: 可以看到,在执行异步操作的过程中,主线程不会等待异步操作结束,而是继续往下执行后续的代码,当满足条件时触发异步操作的回调函数。 异步

    2024年02月01日
    浏览(51)
  • SpringBoot--@Async异步

    包 注解 整体 异步类需要交给Spring管理 @Component 异步方法需要@Async修饰

    2024年02月11日
    浏览(41)
  • Ajax_4(进阶)同步异步+ 宏任务微任务 + Promise链 + async终极解决方案 +事件循环原理 + 综合案例

    01-同步代码和异步代码 什么是同步代码? 同步代码:逐行执行,需要原地等待结果后,才继续向下执行。 什么是异步代码? 调用后耗时,不阻塞代码继续执行,(不必原地等待),在将来完成后 触发一个 回调函数 。 代码阅读 目标:阅读并回答代码执行和打印的顺序 打印

    2024年02月13日
    浏览(50)
  • Swift async/await 并发中如何将任务组(TaskGroup)转换为异步序列(AsyncSequence)

    在 Swift 新结构化并行模型的开发中, 提出了任务组(TaskGroup)和异步序列(AsyncSequence)的概念。有时候,为了简洁和效率方面的原因,我们需要将 TaskGroup 的结果转换为异步序列。 如上图所示,我们试图将任务组的结果转换为异步序列,但不幸失败了。 那么,最终我们到

    2024年02月12日
    浏览(43)
  • SpringBoot中异步注解@Async介绍

    介绍在SpringBoot项目中,使用@Async不生效的原因介绍和分析; 代码参考gitee仓库:spring-boot-2022-05: 主要是介绍Spring框架注解、常用的功能的使用案例,记录平时遇到的技术知识点,进行实践操作; - Gitee.com 1.启动类中没有添加注解@EnableAsync; 2.同一个类中调用含有@Async的方法;因

    2023年04月17日
    浏览(35)
  • async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道

    学习关键语句 : async , await 用法 await 怎么使用 同步任务和异步任务 微任务和宏任务 js中代码执行顺序 虽然说 async 和 await 是 Promise 的语法糖 , 但是用惯了Promise 的人(我) , 还真不能超快速使用上这个语法糖 , 所以赶紧写一篇文章出来让各位了解了解这个到底怎么用在我的项目

    2024年02月03日
    浏览(48)
  • springboot @Async 异步调用接口处理数据

    @Async 异步背景 新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。 系统生效按钮---controller新增--异步调用servcie---数据集成 在springboot框架中实现步骤 首先在启动类上加上 @EnableAsync 注解开启项目的异步调用功能,其次

    2024年02月16日
    浏览(42)
  • SpringBoot异步方法支持注解@Async应用

    合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异步的执行方法, SpringBoot已经提供了异步方法支持注解. service层: controller层: 测试结果: 我们可以感受到接口

    2024年02月11日
    浏览(48)
  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用async Task await异步任务编程优化

    Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类: Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform请求http接口_霸道流氓气质的博客-CSDN博客 参考前面使用HttpClient调用http的get和post接口的小示例, 需要定

    2024年02月02日
    浏览(55)
  • springboot 与异步任务,定时任务,邮件任务

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。 SpringBoot 实现比较简单 主启

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包