Discuss / Java / 使用Spring MVC实现异步处理请求 ,使用线程池提交查询user任务,也不知道这样写有毛病没得哦

使用Spring MVC实现异步处理请求 ,使用线程池提交查询user任务,也不知道这样写有毛病没得哦

Topic source

净净一隅

#1 Created at ... [Delete] [Delete and Lock User]

AppConfig增加线程池Bean

@Bean
ExecutorService createExecutorService(){
return Executors.newCachedThreadPool();
}

ApiController

@Autowired
ExecutorService executorService;

@GetMapping("/users/{id}")
//public User user(@PathVariable("id") long id) { return userService.getUserById(id);}
public DeferredResult<User> user(@PathVariable("id") long id) {
DeferredResult<User> result = new DeferredResult<>(3000L); // 3秒超时
executorService.submit(new GetUserTask(result,id));
return result;
}

class GetUserTask implements Runnable{
private long id;
private DeferredResult<User> result=new DeferredResult<>(3000L);

public GetUserTask(DeferredResult<User> result,long id){
this.result=result;
this.id=id;
}

public void run(){
// 等待1秒:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
try {
User user = userService.getUserById(id);
// 设置正常结果并由Spring MVC写入Response:
result.setResult(user);
logger.info("deferred result is set");
} catch (Exception e) {
// 设置错误结果并由Spring MVC写入Response:
Map<String,Object> map=new HashMap<>();
map.put("error",e.getClass().getSimpleName());
map.put("message",e.getMessage());
result.setErrorResult(map);
logger.info("deferred result is set");
}
}
}


  • 1

Reply