接口请求中使用异步线程

 背景有某张表的初始化操作被做成了接口,考虑到若数据量较大时,接口的时长会过长,因此考虑使用线程来执行,让接口立即返回。

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。

 

上一篇:Linux内核启动流程详解


下一篇:Python函数和类