前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot---(4)SpringBoot异步处理任务

Spring Boot---(4)SpringBoot异步处理任务

作者头像
IT云清
发布2019-01-22 10:31:21
1.6K0
发布2019-01-22 10:31:21
举报
文章被收录于专栏:IT云清

场景:现在需要上传一个Excel表格,数据量几万条,而且,上传解析后还需要进行计算,然后插入数据库。

分析:上传和解析,都很简单,但是,这里如果使用同步方式,那么:上传-->解析-->运算-->插入数据库;这个过程,前台的页面都是等待状态的,用户会以为页面卡死了。所以,这里需要做异步处理:

1.上传-->返回正在解析的标志;

2.解析-->运算-->插入数据库;

此时,当用户上传完文件后,页面立马跳转,解析,运算等工作,继续在后台进行,而用户可以不用等待。

这里简单记录一下,springBoot的异步使用方式。

1.同步方式

controller

代码语言:javascript
复制
 /**
     * 同步处理
     * @return
     */
    @RequestMapping(value = "test2",method = RequestMethod.GET)
    public String test2(){
        loginService.getTest2();
        logger.info(Thread.currentThread().getName()+"==========主线程名");
        return "同步,正在解析......";
    }

serviceImpl

代码语言:javascript
复制
 /**同步方法*/
    @Override
    public void getTest2(){
        Building building = new Building();
        synchronized (building){
            try {
                for (int i = 1;i <= 100;i++){
                    logger.info(Thread.currentThread().getName()+"----------同步:>"+i);
                    building.wait(200);
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
    }

这种同步的方式处理,会发现,当这100此循环完成后,页面才会返回 :同步,正在解析......。当后台在循环处理时,前台的页面始终处于等待状态。可以发现,使用都是一个线程在处理:

2.异步任务方式一

使用线程池,创建新的线程去处理,如下:

controller

代码语言:javascript
复制
/**
     * 异步处理1:线程池,创建新线程处理
     * @return
     */
    @RequestMapping(value = "test3",method = RequestMethod.GET)
    public String test3(){
        ExecutorService service = Executors.newFixedThreadPool(5);
        RunnableTask1 task1 = new RunnableTask1();
        service.execute(task1);
        logger.info("=========》当前线程名:"+Thread.currentThread().getName());
        return "异步,正在解析......";
    }

线程任务

代码语言:javascript
复制
public class RunnableTask1 implements Runnable{
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void run(){
        Building building = new Building();
        synchronized (building){
            try {
                for (int i = 1;i <= 100;i++){
                    System.out.println(Thread.currentThread().getName()+"----------异步:>"+i);
                    building.wait(200);
                }
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
    }
}

我们看控制台,会发现,主线程,和处理任务的线程,不是一个线程,也就是,当页面请求后,主线程会返回我们想要返回的标识,这里返回的是一个字符串:异步,正在解析......,而线程池新开了一个线程,在后台处理业务逻辑。所以,此时访问接口后,会立马返回,页面不用等待,处理逻辑在后台默默进行。控制台如下:

3.异步任务 方式二

这种方式,是springBoot自身的一种异步方式,使用注解实现,非常方便,我们在想要异步执行的方法上加上@Async注解,在controller上加上@EnableAsync,即可。注意,这里的异步方法,只能在自身之外调用,在本类调用是无效的

controller

代码语言:javascript
复制
@RestController
@RequestMapping("tmall")
@EnableAsync
public class LoginController {
    private final org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private LoginService loginService;
    /**
     * 异步处理2:使用springBoot自带async注解
     */
    @RequestMapping(value = "test1",method = RequestMethod.GET)
    public String test1(){
        loginService.getTest1();
        logger.info("============>"+Thread.currentThread().getName());
        return "异步,正在解析......";
    }

serviceImpl

代码语言:javascript
复制
    /**异步方法
     * 有@Async注解的方法,默认就是异步执行的,会在默认的线程池中执行,但是此方法不能在本类调用;启动类需添加直接开启异步执行@EnableAsync。
     * */
    @Async
    @Override
    public String getTest1(){
        Building building = new Building();
        synchronized (building){
            try {
                for (int i = 1;i <= 100;i++){
                    logger.info(Thread.currentThread().getName()+"----------异步:>"+i);
                    building.wait(200);
                }
                return "执行异步任务完毕";
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
        return Thread.currentThread().getName()+"执行完毕";
    }

看控制台,会发现,页面发出请求后,主线程会返回,而内置的线程池会新开线程,在后台执行任务。此时页面不用等待,可以继续其他操作。

可以看到,很多情况下,异步处理,是一种很常见,而且很高效的方式,我比较喜欢使用springBoot自带的注解方式,只用两个注解即可了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年01月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档