背景有某张表的初始化操作被做成了接口,考虑到若数据量较大时,接口的时长会过长,因此考虑使用线程来执行,让接口立即返回。
1.0版本
1 @RequestMapping(value = "/init", method = RequestMethod.GET) 2 public Result init() { 3 Thread thread = new Thread(()-> businessContractChangeService.initBusinessContractChange()); 4 thread.start(); 5 return Result.success(); 6 }
这样书写能够实现接口的立即返回,和数据库中表的插入 。但是表中的操作人未拿到。其原因是操作人的信息在请求的线程中,新建的线程中没有操作人信息所以拿不到。
2.0版本
1 /** 2 * 初始化方法 3 * 4 * @return {@link Result} 5 */ 6 @RequestMapping(value = "/init", method = RequestMethod.GET) 7 public Result init() { 8 businessContractChangeService.initBusinessContractChange(UserContext.getUser()); 9 return Result.success(); 10 }
/** * 初始化业务合同更改 */ @Async @Override public void initBusinessContractChange(IUser<?> user) { UserContext.setUser(user); }
优化后,将操作人信息作为参数,传入异步线程方法。 并且线程也不是显示的使用new关键词新增。而是使用Spring的异步线程注解@Async。