在上一篇 小白的web优化之路 三、使用MQ来实现事务异步处理 中,我们使用MQ来将任务异步话,使接口速度得到的极大的提高,这一节中,我们就要考虑一个需要同步返回多次请求的问题。
在完成了产品经理的那个发送短信通知的‘古怪’需求之后,小白觉得自己终于可以继续开发CURD的任务了,心里不免有点小激动。突然,小白收到了产品经理的一个消息,小白心里一震,打开消息,屏幕上写着“小白我这有一个获取信息的需求,你过来一下吧”。
小白心里一想,不就是获取信息么,谁不会呢?哪知道去了产品经理的需求后,小白才意思到自己还是太年轻,这个获取信息的接口需要调用公司其它组的多个接口,然后将数据聚合起来,而且数据要求实时,并根据用户喜好返回不同的数据,这就要求很难去做一个缓存。但是如果一个一个去调用接口的话,那岂不是这个接口的总时长要爆炸?前端肯定是不会同意的?那怎么办呢?
这时候小白的主管过来了,看到这种情况,跟小白说,我们可以使用异步请求接口,这样假使有5个接口,我们也可以以请求一个接口的速度来获取到数据。小白开始嘀咕,如果这样的话,那我是启动五个线程,去执行对应的Runnable,那我岂不是在主线程中循环的判断这个Runnable有没有执行完,并获取到相应的结果,听起来好复杂啊。主管笑了笑,你可以使用Java中的Callable与Future。
在Java中,其实已经有了对异步处理任务并返回相应结果的类,即为Callable与Future。其中Callable为我们执行任务的接口,我们实现了Callable接口之后,将其封装到Future中,既可以使用Future来获取异步数据值,停止异步任务,捕捉异步操作中的异常等。
我们以接口中异步获取5个网站数据为例,下面是Callable接口:
package com.happyheng.callable;
import com.happyh