2019独角兽企业重金招聘Python工程师标准>>>

在项目中会遇到这样的情况,由于后台需要执行、计算一段时间(如计算积分、自动排课等)。这时前台请求一段时间后,得不到返回结果就会发生请求超时。

拿自动排课来说,如果一个学校上百个班级,执行一次排课可能需要1-2分钟甚至更长时间,那么会造成前台访问接口超时(当然也可以延长超时时间实现)。

解决方案:

考虑改造为轮询查询程序执行结果。

1. 后台改造:

将自动排课功能的接口分为两个:

①创建线程执行自动排课

②提供接口查询排课结果

对原有的方法进行改造:原有的方法,方法执行完成后才会返回执行结果。时间过长,考虑将原方法改造为线程执行,这样一旦线程开始执行,就可以返回结果。

改造方法:

  • 自动排课功能所在的service类实现Runnable接口,将自动排课的实现逻辑写在run方法中。
  • 编写方法①创建并执行线程,执行run方法。
  • Controller层调用方法①实现自动排课功能。
  • 对于自动排课结果,可以放在redis中,接口①实时更新自动排课的状态(成功或者失败),可以通过接口②每间隔一段时间查询自动排课的结果。

代码示例:

Controller层


@Controller
public class Controller{@Autowired//自动注入排课功能所在的serviceprivate CourseTableService courseTableService; @RequestMapping(value = "/arrange/{id}")@ResponseBodypublic ResponseMessage arrange(@PathVariable String id) {return courseTableService.arrange(id); //自动排课}@RequestMapping(value = "/arrangeResult/{id}")@ResponseBodypublic Map<String,Object> arrangeResult(@PathVariable String id) {//查询自动排课结果,并返回}
}

Service层

@Service
@Transactional(readOnly = true)
public class CourseTableService implements Runnable {  //实现Runnable接口@Autowiredprivate ThreadPoolTaskExecutor taskExecutor; //线程池  //自动paikepublic ResponseMessage arrange(String scheduleId) {this.scheduleId=scheduleId;  //设置run方法中需要用的参数taskExecutor.execute(this); //执行线程return ResponseMessage.ok(); //返回线程执行结果}//自动排课,线程public void run(){ //排课逻辑代码String scheId=this.scheduleId; //使用接收的参数}
}

    2. 前端大致分两次请求后台接口:

第一次请求接口自动排课(线程或者mQ执行),这样在启动自动排课的时候就返回请求结果,告知用户正在进行排课。

然后轮询调用第二接口,每隔几秒钟就去查询排课的结果。如果返回的状态为0代表排课成功,提示用户;如果返回的状态为1达标排课失败,提示失败原因;如果返回的状态为2代表排课正在执行中,继续轮询访问查询排课结果的接口。

主要代码示例:

var intervalFlag=true; //是否执行轮询的标志
//_post2是封装的ajax请求,
$._post2('/arrange/' + _id, {}, function(res) { var interVal;//调用接口,查询自动排课结果,加上这个是为了用户点击后立马访问,ajax同步访问,//因为这次的查询结果决定了,是否执行轮询。getProgress(_id, interVal); if(intervalFlag){//第一次查询结果表明排课还在进行中,才会执行轮询。//如果第一次已经返回结果表示程序执行完成,就不需要轮询访问排课结果了。interval(_id); }
});// 进度查询
function getProgress(_id, interVal) {$._post2('/arrangeResult/' + _id, {}, function(res) {if (res.arrangeStatus == 0) {//排课成功clearInterval(interVal); //清空轮询intervalFlag=false; //设置为不执行轮询}else if(res.arrangeStatus==1){//排课失败clearInterval(interVal);intervalFlag=false;}else if(res.arrangeStatus==2){//排课进行中,什么都不做}});
}// 隔两秒访问
function interval(_id) {var pro;// 定时器var interVal;interVal = setInterval(function() {// 获取返回对象pro = getProgress(_id, interVal);}, 2000);
}

转载于:https://my.oschina.net/u/3706132/blog/1550617

调用接口处理时间过长,前端访问超时解决方案相关推荐

  1. android如何调用接口方法,在Android中访问WebService接口的方法

    需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 代码如下: //WebService的命名空间 static final Str ...

  2. 接口访问超时 504 Gateway Time-out 优化方案

    我们在调用GET请求获取数据的接口中,由于接口的处理逻辑复杂.查询的数据库表过多.nginx设置的超时时间过短和慢sql等原因,会造成接口请求了20秒左右,都没有结果返回,浏览器就会报错504 Gat ...

  3. 调用后台接口返回报错前端隐藏提示_腾讯社交联盟广告

    开发者帮助中心 优量汇服务体系升级了,除查阅本页常见问题外,还可以通过以下渠道解决您遇到的问题 1. 实时智能客服 入口:优量汇官网.开发者平台.优量汇服务号 时间:7*24即时问答 服务内容:涵盖 ...

  4. webstorm前端调用后端接口_一篇前端同学对后端接口的吐槽

    来源:juejin.im/post/5cfbe8c7e51d4556da53d07f 前言 去年的某个时候就想写一篇关于接口的吐槽,当时后端提出了接口方案对于我来说调用起来非常难受,但又说不上为什么, ...

  5. vue调用接口修改密码_vue开发前后端分离前端如何调用后端接口?

    对前后端分离如何调用接口这块感觉一直没怎么弄明白,但又不知如何说明,下面我模拟一个项目说明我的问题. 现在我们有个项目,前端用vue开发,后端php开发,后端测试地址为:localhost:8181, ...

  6. okhttp3调用接口超时

    使用okhttp3调用接口,经常出现超时现象,报timeout异常或者Read timed out! 代码是这样写的 OkHttpClient client = new OkHttpClient(); ...

  7. 调用后台接口返回报错前端隐藏提示_从零开始的Android新项目9 - 前端用后台接口设计...

    这回来讲讲后台接口的设计. 可能有同学会觉得后台的接口和我们大前端开发有什么关系?试想一下,在碰到一些不合理的接口设计的时候,你们开发是否觉得很别扭--需要为了坑爹的接口写很多脏代码引坑?甚至,这么开 ...

  8. linux服务器调用端口超时,Linux服务器可以ping,但是telnet端口超时,网站wget超时,访问超时的解决办法...

    最近无法通过SSH连接Linux服务器,访问该服务器上的HTTP服务也出现异常.可以ping,但是telnet端口超时,网站wget超时,访问超时. 最后排查是内核配置问题 原来是 net.ipv4. ...

  9. 根据接口文档书写接口,并在前端调用接口返回显示出数据(加下载)

    ---恢复内容开始--- 1.首先来看接口文档(其中一个接口): 接口的编写: 1 /** 2 * 7.11 余额明细查询接口3 *4 *@paramtoken5 *@parampageNum6 * ...

最新文章

  1. R语言length函数计算向量、列表、字符串长度实战
  2. PCA(principal component analysis)主成分分析降维和KPCA(kernel principal component analysis​​​​​​​)核
  3. oracle12c不能进入到http://localhost:1158/em的解决办法
  4. grub 的安装与使用
  5. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
  6. 0308互联网新闻 | 网易云音乐App上线小程序入口;谷歌为机器学习框架TensorFlow发新模块...
  7. matlab逆变换法产生随机数_matlab数值积分方法(一)
  8. [转]android ListView详解
  9. 用GDB排查Python程序故障
  10. 基于深度学习的文本分类2
  11. mysql查看系统参数
  12. mysql not in 转化_解析MySQL隐式转换问题
  13. python能做什么工作-python语言能做什么工作
  14. java day63【 SSM 整合 】
  15. java图书馆_java入门第三季--图书馆借书系统
  16. java 线程 block_JAVA线程的BLOCK状态实例分析
  17. 【Centos】【Linux】如何杀掉进程——【进程杀手】2020-12-01
  18. 用Javascript实现放大镜效果
  19. 域名到期查询如何查看?有什么新方法吗?
  20. 随机生成数字字母组合

热门文章

  1. Tkinter Helloword !
  2. 《实践与思考》系列连载(5)——问答Hprose,以及关于技术与开源的思考
  3. 3/7 SELECT语句:过滤(WHERE)
  4. STL——萃取机制(Traits)
  5. parallels desktop虚拟机与Mac共享网络设置方法
  6. BZOJ1010 [HNOI2008]玩具装箱toy 动态规划 斜率优化
  7. 内置函数(面向对象)
  8. 如何为Myeclipse手工添加dtd支持
  9. linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
  10. [Oracle] Enable Row Movement