首页 > 编程语言 >如何进行SpringMVC异步编程

如何进行SpringMVC异步编程

时间:2023-04-03 23:44:59浏览次数:47  
标签:异步 service SpringMVC 编程 线程 DeferredResult 我们

前言

SpringMVC是我们平时用的最多的异步编程框架,但是我们在使用的时候基本上只是用到了它的同步编程。一般情况下是够用的,但是在并发量比较大的时候可能就不会够用了,因为一个请求会占用一个tomcat线程,这个时候我们可以尝试使用异步编程的方式来提高吞吐量。

环境准备

maven依赖:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

同步

我们在介绍异步编程之前先回顾一下同步的方式

项目结构:

controller

service

我这里只是做一下模拟操作,就不引用数据库的操作了。

这种同步的编程方式可能就是我们平时用的最多的一种形式,简单直观。

异步

首先我们需要在启动类上加上 @EnableAsync 注解开启异步支持,然后我们再定义一个Executor,这样的话我们在想要异步执行的方法上面加上@Async("asyncExecutor")注解。如果觉得每次都要指定使用哪个线程池麻烦的话,可以让我们的配置类继承AsyncConfigurerSupport然后覆写getAsyncExecutor()方法,这样我们就可以直接使用@Async而不用指定名称。

service改造

我们service返回一个AsyncResult或者 CompletableFuture,然后在方法上面加上@Async注解

虽然我们的service改造成了异步的但是如果我们在controller直接调用get方法获取值那么还是会阻塞住

controller改造

controller的异步有多种方式我这里介绍常用的三种

  • DeferredResult

DeferredResult 这个类代表延迟结果。DeferredResult 可以用在异步任务中,其他线程能够获取 DeferredResult 并设置 DeferredResult 的返回数据。通常可以使用线程池、队列等配合。我们这里直接使用之前定义的哪个线程池。

  • Callable

使用 Callable 进行异步处理与 DeferredResult 类似。不同的是,Callable 会交给系统指定的 TaskExecutor 执行。

  • WebAsyncTask

后两个默认是使用SimpleAsyncTaskExecutor,这个会为每次请求创建一个新的线程。

我们可以配置async 的线程池,不需要为每个任务单独指定。

通过configurer.setTaskExecutor(threadPoolTaskExecutor());来指定线程池。

这样就可以指定TaskExecutor了

标签:异步,service,SpringMVC,编程,线程,DeferredResult,我们
From: https://www.cnblogs.com/loveletters/p/springmvc-async.html

相关文章

  • Quarkus系列—— RESTEasy与SpringMVC(二)
    简述RestEasy在Quarkus中的作用跟SpringMVC在SpringBoot中类似。简介RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTfulWebServices和RESTfulJava应用程序。我们以第一部分的代码为例来介绍如何通过RESTEasy的各种注解来开发Web应用,因为RESTEasy实现了JAX......
  • 第十一章:网络编程
    在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。因此可以用Socket来描述网络连接的一对一关系。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种......
  • 第七章:并发编程
    第七章:并发编程目录第七章:并发编程一、并发与并行二、Go协程(Goroutine)1Go协程介绍2启动Go协程3GMP调度模型三、信道(Channel)1信道使用2死锁现象3单向信道【了解】4关闭信道5循环信道四、缓冲信道1缓冲信道2WaitGroup五、select六、mutex七、异常处理一、并发与并行并......
  • 我的第一个win32汇编程序
    .386.ModelFlat,stdcalloptioncasemap:none;头文件包含includewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.libincludegdi32.incincludelibgdi32.lib;数据段定义.datahInstancedd......
  • 函数式编程-高阶函数
    函数本身也可以赋值给变量,即:变量可以指向函数  那么函数名是什么呢?函数名其实是指向函数的变量!对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数! 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函......
  • 编程里同步和异步的选择
    同步是指方法调用后必须等到返回才会执行后续代码异步是方法调用没等到返回也可以继续执行后续代码在java中如果是多线程,而各线程间会公用一个变量时,需要使用同步来保证线程安全,否则异步就是最好的在前端js中,一般http请求都是默认异步的,允许在发送http请求时执行其他函数,这样......
  • 零基础Go语言从入门到精通(数据库编程:02-Gorm 操作 MySQL 数据库)
    gin-gorm-api-example/main.goatmaster·cgrant/gin-gorm-api-example·GitHubhttps://github.com/cgrant/gin-gorm-api-example/blob/master/main.goGorm介绍ThefantasticORMlibraryforGolangGo语言的超棒的ORM类库功能强大:全功能ORM(几乎)关联(包含一个,包含多个,属......
  • 网络原理与网络编程
     io模型有哪些网络io模型?哪些网络操作可以是异步的?常见的网络IO模型有:同步阻塞IO,同步非阻塞IO,多路复用IO和异步IO。异步网络操作包括:连接请求,数据发送和数据接收。(不确定)select/poll/epollselect/poll与epoll区别select和poll是两个系统调用,用于监视多个......
  • Rust编程语言入门
    Rust编程语言入门Rust简介为什么要用Rust?Rust是一种令人兴奋的新编程语言,它可以让每个人编写可靠且高效的软件。它可以用来替换C/C++,Rust和他们具有同样的性能,但是很多常见的bug在编译时就可以被消灭。Rust是一种通用的编程语言,但是它更善于以下场景:需要运行时的速度需......
  • 详细解析Java异步线程处理队列任务工具类以及实战
    场景待入快速理解小场景描述:【一群人】来到【一个大厅】办理业务,大厅中有【多个窗口】给我们办理业务。每个人都有自己要办事情,处理过程需要消耗时间。大厅根据人群多少,开始窗口梳理。如果把“一群人”理解成一群待处理的n个【任务】,把这群人排成一个长队就形成了一个【任......