在 Java 里,“API 接口异步”通常有三种常见场景,下面按从最常见到进阶给你讲,并附示例。
适合:接口马上返回,后台慢慢处理(如发邮件、写日志)
@SpringBootApplication
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Service
public class AsyncService {
@Async
public void doWork() {
// 模拟耗时
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
System.out.println("异步任务完成");
}
}
@RestController
public class TestController {
@Autowired
private AsyncService asyncService;
@GetMapping("/test")
public String test() {
asyncService.doWork();
return "请求已接收";
}
}
✅ 客户端立刻收到响应
✅ 后台任务异步执行
Future / CompletableFuture(带结果)适合:接口需要异步计算结果后返回
@Async
public CompletableFuture<String> asyncTask() {
return CompletableFuture.completedFuture("处理完成");
}
@GetMapping("/future")
public CompletableFuture<String> future() {
return asyncService.asyncTask();
}
Spring 会自动等 CompletableFuture 完成再返回结果。
避免默认线程池问题:
@Configuration
public class AsyncConfig {
@Bean("asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("async-");
executor.initialize();
return executor;
}
}
@Async("asyncExecutor")
public void doWork() {}
@RequestMapping("/async")
public void async(HttpServletRequest request) {
AsyncContext context = request.startAsync();
context.start(() -> {
// 业务逻辑
context.complete();
});
}
适合:高并发、可靠异步
接口 → MQ → 消费者
| 方式 | 是否立即返回 | 是否带结果 | 推荐度 |
|---|---|---|---|
| @Async | ✅ | ❌/✅ | ⭐⭐⭐⭐ |
| CompletableFuture | ✅ | ✅ | ⭐⭐⭐⭐ |
| 线程池 | ✅ | ❌ | ⭐⭐⭐⭐ |
| Servlet Async | ✅ | ❌ | ⭐⭐ |
| MQ | ✅ | ❌ | ⭐⭐⭐⭐⭐ |
如果你有具体场景(如:接口超时、批量处理、高并发、Spring Cloud),我可以给你更精确的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。