springboot controller异步调用
时间: 2025-03-05 18:28:31 浏览: 49
### 实现 Spring Boot 控制器中的异步调用
为了在 Spring Boot 应用程序中实现控制器的异步调用,可以遵循以下方式构建应用程序结构和配置。
#### 配置主类
确保主应用类已启用异步支持。这可以通过添加 `@EnableAsync` 注解到主类上来完成[^2]:
```java
package com.work;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class SpringBootWorkApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootWorkApplication.class, args);
}
}
```
#### 创建异步服务类
由于在同一类内无法有效触发代理机制从而导致异步功能失效的情况存在,因此建议将实际执行的任务逻辑放置于独立的服务类之中[^1]。这里定义了一个简单的异步服务接口及其对应的实现类:
```java
// AsyncService.java
package com.work.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public interface AsyncService {
@Async
void performTask();
}
// AsyncServiceImpl.java
package com.work.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class AsyncServiceImpl implements AsyncService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
@Async
public CompletableFuture<Void> performTask() throws InterruptedException {
logger.info("Starting async task...");
Thread.sleep(5000L); // Simulate a long-running process.
logger.info("Finished async task.");
return CompletableFuture.completedFuture(null);
}
}
```
注意,在此例子中不仅实现了 `performTask()` 方法作为真正的业务处理单元,还通过返回 `CompletableFuture<Void>` 来允许客户端跟踪任务进度并接收回调通知。
#### 构建控制器以发起异步请求
最后一步是在控制器层面上提供 RESTful API 接口供外部访问,并在此处调用之前创建好的异步服务实例:
```java
// TaskController.java
package com.work.controller;
import com.work.service.AsyncService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/tasks")
public class TaskController {
private final AsyncService asyncService;
@Autowired
public TaskController(AsyncService asyncService){
this.asyncService = asyncService;
}
@GetMapping("/async-task")
public String startAsyncTask(){
try{
asyncService.performTask().get(); // Wait for the completion of asynchronous operation synchronously here just to demonstrate purpose only.
// In real-world applications you may not want your web request waiting on an async call like this.
} catch (Exception e){
System.out.println(e.getMessage());
}
return "Asynchronous task has been started.";
}
}
```
上述代码片段展示了如何在一个名为 `/tasks/async-task` 的 GET 请求路径下启动一个异步任务。需要注意的是,尽管在这个例子中使用了 `.get()` 方法等待异步操作的结果以便展示目的,但在生产环境中通常不会这样做,而是让前端轮询状态或设置监听器等方式获取最终结果。
阅读全文
相关推荐


















