SpringBoot项目中实现异步任务

Application启动类添加注解:@EnableAsync

注解启用了 Spring 异步方法执行功能
详见: Spring Framework API

package com.xx.xxxx;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@MapperScan({"com.xx.*.mapper"})
@EnableAsync
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication .class, args);
    }

}

在方法上添加注解:@Async

在Spring中,基于@Async标注的方法,称之为异步方法;
这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作;

方法返回值定义需使用Future接口做封装
方法返回值返回需实现AsyncResult类做封装

    @Override
    @Async
    public Future<String> testMethod(Integer recordId) {
        //业务代码实现
        return new AsyncResult<>("返回结果");
    }

Future接口:

  • 当异步执行结束之后,返回的结果将会保存在Future中。
  • 执行一个长时间运行的任务时,使用Future可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。
  • 经常会使用到Future的场景有:1. 计算密集场景。2. 处理大数据量。3. 远程方法调用等。

AsyncResult类:

  • 类封装异步委托上的异步操作的结果,与异步委托一起使用
  • AsyncResult 具有 AsyncDelegate 属性,该属性保存在其上调用异步调用的委托对象

调用异步方法并获取返回值

必须使用循环来判断方法执行状态来获取返回值

public ResponseModel<Object> sendServiceNotification(Integer recordId){
        Future<String> res = xxxService.testMethod(1);
        try{ //循环获取异步任务执行是否结束,结束则获取返回值返回
            while(true){
                if (res.isDone()) {
                    return ResponseModel.success(res.get());
                }
                //居民数多,推送时间较久,可放缓循环时间,但线程休眠会导致请求超时
                //Thread.sleep(1000);
            }
        }catch (InterruptedException e) {
            e.printStackTrace();
        }catch (ExecutionException e) {
            e.printStackTrace();
        }
        return ResponseModel.success("内容已推送!");
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值