spring异步请求并返回结果

文章场景

我最近在做大屏可视化,因此有时候一个折线图显示很多维度的信息,每个维度极端都需要计算好几秒,如果用同步计算,那耗时就是每个维度计算的时间之和,因此很有必要使用异步请求。

配置工作

启动类添加注解

//能够使用异步
@EnableAsync

模拟请求

我们先写一个controller,供测试请求
代码如下:.

@RestController
@RequestMapping("test")
@CrossOrigin
public class TestController {
	//添加日志类
    Logger logger = LoggerFactory.getLogger(TestController.class);
    //注入实现类
    @Autowired
    private TestImpl tests;
	//异步测试请求
    @GetMapping(value = "/async")
    @ApiOperation(value = "测试异步请求")
    public HttpResult async() {
    	//存放返回结果
        List<String> result = new ArrayList<>();
        //辅助类,允许多个线程一直等待
        CountDownLatch countDownLatch = new CountDownLatch(6);
        //调用实现类的方法,每个方法阻塞3秒
        tests.getString(result,countDownLatch);
        tests.getString(result,countDownLatch);
        tests.getString(result,countDownLatch);
        tests.getString(result,countDownLatch);
        tests.getString(result,countDownLatch);
        tests.getString(result,countDownLatch);
        try {
        	//辅助类等待结果,直到线程都返回结果或者到100秒不再等待
            countDownLatch.await(100, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //把返回的结果打印出来
        return HttpResult.ok(JSONObject.toJSONString(result));
    }
}

创建阻塞请求

@Service
public class TestImpl {
	//异步方法注解,也可以添加在类上,表示所有方法都是异步方法
    @Async
    public void getString(List<String> result, CountDownLatch countDownLatch) {
        try {
       		//阻塞3秒
            Thread.sleep(3000);
            //结果放入列表,传回请求
            result.add("hello");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
        	//线程减一
            countDownLatch.countDown();
        }
    }
}

测试请求

启动项目后,在浏览器测试请求:
http://localhost:8003/test/async

预期结果

如果是不用异步,应该是需要18秒才能返回结果,但现在应该是3秒多返回结果:

{"code":"000000","message":"[null,\"hello\",\"hello\",\"hello\",\"hello\",\"hello\"]","data":null}

结语

异步确实可以提高效率,但对于返回的结果记得验证,欢迎大家一起讨论,共同学习

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值