springboot实现异步接口

本文详细介绍如何在SpringBoot项目中使用异步任务,包括创建项目、配置异步方法及线程池,实现数据埋点等功能,提升系统响应速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用范围:不需要返回值且想要接口非常快的的需求,例如数据埋点,日记等,废话不多说直接开始搭建项目。

首先用idea创建一个springboot工程项目

1.在启动类上加注解 @EnableAsync 开启异步任务

2.编写正常controller不依赖service的返回值

3.编写service,开启异步任务,方法没有返回值

/**
* 在什么都不配置的情况下,测试默认开启8个线程处理任务,线程名称为task-1 ~ task-8
* @throws Exception
*/
@Async
public void asyncTask() throws Exception{
    long start = System.currentTimeMillis();
    System.out.println("当前线程名称:" + Thread.currentThread().getName());
    Thread.sleep(20000);
    long end = System.currentTimeMillis();
    System.out.println("service任务执行:" + (end-start));
}

4.配置线程池配置,然后什么都不用管就行了

@Configuration
public class ThreadExecutorConfig {

    /**
     * 配置线程池
     * ThredPoolTaskExcutor的处理流程:当池子大小小于corePoolSize,就新建线程,并处理请求
     *                当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
     *                当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
     *                当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
     *                其会优先创建  CorePoolSiz 线程, 当继续增加线程时,先放入Queue中,当 CorePoolSiz  和 Queue 都满的时候,就增加创建新线程,当线程达到MaxPoolSize的时候,就会抛出错
     *               另外MaxPoolSize的设定如果比系统支持的线程数还要大时,会抛出java.lang.OutOfMemoryError: unable to create new native thread 异常。
     * @return
     */
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        // 线程池维护线程的最少数量
        taskExecutor.setCorePoolSize(5);
        // 线程池维护线程的最大数量
        taskExecutor.setMaxPoolSize(10);
        // 缓存队列
        taskExecutor.setQueueCapacity(10);
        taskExecutor.setThreadNamePrefix("MyThread");
        // 设置拒绝策略
        taskExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                // .....
                System.out.println("do somethings by myself ...");
            }
        });
        taskExecutor.initialize();
        return taskExecutor;
    }
}

测试快速的请求接口,即使线程阻塞也会发现请求非常的快

### Spring Boot 中实现文件异步下载 为了实现在 Spring Boot 应用程序中的文件异步下载,可以利用 `@EnableAsync` 注解来启用异步支持,并结合 `CompletableFuture` 来管理异步操作的结果。下面是一个完整的例子展示如何创建一个简单的接口用于触发文件的异步下载。 #### 启用异步支持 首先,在启动类上添加 `@EnableAsync` 注解以开启全局异步方法执行能力[^1]: ```java package cn.juwatech.asyncdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class AsyncDemoApplication { public static void main(String[] args) { SpringApplication.run(AsyncDemoApplication.class, args); } } ``` #### 创建服务层处理异步任务 接着定义一个服务组件负责实际的文件读取与准备下载的工作。这里假设有一个名为 `FileDownloadService` 的服务类实现了具体的业务逻辑[^5]: ```java @Service public class FileDownloadService { @Async public CompletableFuture<byte[]> downloadLargeFileAsynchronously() throws InterruptedException { // Simulate a long-running file preparation process. Thread.sleep(5000); // Sleep for 5 seconds to mimic the delay. byte[] data = new byte[]{...}; // Replace this line with actual code that reads your large file into memory as bytes array return CompletableFuture.completedFuture(data); } } ``` 注意这里的 `downloadLargeFileAsynchronously()` 方法被标记为 `@Async`,这意味着它将在单独线程池中运行而不是阻塞主线程。 #### 控制器暴露 REST API 接口 最后编写控制器部分以便客户端可以通过 HTTP 请求发起文件下载请求。当接收到请求时,会立即返回给前端提示信息告知其正在处理中;与此同时后台继续完成剩余工作直至最终生成可供访问链接或直接传输二进制流给浏览器[^3]: ```java @RestController @RequestMapping("/api/files") public class FileController { private final FileDownloadService fileDownloadService; @Autowired public FileController(FileDownloadService fileDownloadService){ this.fileDownloadService = fileDownloadService; } @GetMapping(value="/async-download", produces="application/json;charset=UTF-8") public ResponseEntity<String> asyncDownload(){ try{ CompletableFuture<byte[]> futureData = fileDownloadService.downloadLargeFileAsynchronously(); String message = "Your request has been accepted and will be processed shortly."; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity<>(message,headers ,HttpStatus.ACCEPTED); }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } // Additional methods can handle completed downloads or provide status updates... } ``` 在这个案例里,一旦服务器接受到了来自用户的 GET 请求 `/api/files/async-download` ,就会立刻给出反馈而不会等待整个过程结束。之后可以在适当时候通知用户下载已完成或将文件流传送给他们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值