SpringBoot + MyBatis-Plus 使用 ThreadPoolTaskExecutor 完成阅读次数自增

229 阅读1分钟

先看看我的表吧

微信图片_20220816100514.png 第一步: 搞个配置类

@Configuration
// 开启线程
@EnableAsync
public class ThreadPoolConfig {

    @Bean("taskExecutor") //注入spring ...
    public Executor asyncServiceExecutor(){
        //创建对象
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //设置核心线程数
        executor.setCorePoolSize(5);
        //设置最大线程数
        executor.setMaxPoolSize(20);
        //设置队列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
        //设置线程活跃时间
        executor.setKeepAliveSeconds(60);
        //设置线程默认名称
        executor.setThreadNamePrefix("miniipo");
        //等到所有任务结束后关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.initialize();
        return executor;
    }
}

第二部:搞个service

@Component
public class ThreadService {
    //参数跟下面的结合我的数据库看

    @Async("taskExecutor") //注意这个注解
    public void updateViewCount(NewsMapper newsMapper, News news){
        News newsUpdate = new News();
        newsUpdate.setViewCounts(news.getViewCounts() + 1);
        LambdaQueryWrapper<News> newsLambdaQueryWrapper = new LambdaQueryWrapper<>();
        newsLambdaQueryWrapper.eq(News::getId,news.getId());
        newsLambdaQueryWrapper.eq(News::getViewCounts,news.getViewCounts());
        newsMapper.update(newsUpdate,newsLambdaQueryWrapper);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

第三部:直接调用

@Override
public ResponseResult info(Long id) {  // ResponseResult 这个是统一返回对象
    if (id == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
    }
    News byId = this.getById(id);
    threadService.updateViewCount(newsMapper,byId); //这行是调用
    if (StringUtils.isEmpty(id)){
        return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
    }
    return ResponseResult.okResult(byId);
}