interval(_i;
Controller层调用方法实现自动排课功能。
//排课失败
//因为这次的查询结果决定了,是否执行轮询。
//第一次查询结果表明排课还在进行中,才会执行轮询。
创建线程执行自动排课
//自动排课,线程
}elseif(res.arrangeStatus=={
}
提供接口查询排课结果
编写方法创建并执行线程,执行run方法。
改造方法:
//排课逻辑代码
//自动paike
this.scheduleId=scheduleId;//设置run方法中需要用的参数
if(res.arrangeStatus==0){
$._post2('/arrange/'+_id,{},function(res){
//调用接口,查询自动排课结果,加上这个是为了用户点击后立马访问,ajax同步访问,
//查询自动排课结果,并返回
intervalFlag=false;//设置为不执行轮询
StringscheId=this.scheduleId;//使用接收的参数
拿自动排课来说,如果一个学校上百个班级,执行一次排课可能需要1-2分钟甚至更长时间,那么会造成前台访问接口超时(当然也可以延长超时时间实现)。
}
//获取返回对象
对原有的方法进行改造:原有的方法,方法执行完成后才会返回执行结果。时间过长,考虑将原方法改造为线程执行,这样一旦线程开始执行,就可以返回结果。
}
//如果第一次已经返回结果表示程序执行完成,就不需要轮询访问排课结果了。
}
}elseif(res.arrangeStatus=={
}
//_post2是封装的ajax请求,
自动排课功能所在的service类实现Runnable接口,将自动排课的实现逻辑写在run方法中。
});
主要代码示例:
}
//排课成功
varintervalFlag=true;//是否执行轮询的标志
//自动注入排课功能所在的service
clearInterval(interVa;//清空轮询
//排课进行中,什么都不做
returnResponseMessagok();//返回线程执行结果
代码示例:
}
前端大致分两次请求后台接口:
//进度查询
将自动排课功能的接口分为两个:
然后轮询调用第二接口,每隔几秒钟就去查询排课的结果。如果返回的状态为0代表排课成功,提示用户;如果返回的状态为1达标排课失败,提示失败原因;如果返回的状态为2代表排课正在执行中,继续轮询访问查询排课结果的接口。
//隔两秒访问
taskExecutor.execute(this);//执行线程
解决方案:
考虑改造为轮询查询程序执行结果。
}
}
@RequestMapping(value='/arrange/{id}')
后台改造:
}
//定时器
第一次请求接口自动排课(线程或者mQ执行),这样在启动自动排课的时候就返回请求结果,告知用户正在进行排课。
$._post2('/arrangeResult/'+_id,{},function(res){
对于自动排课结果,可以放在redis中,接口实时更新自动排课的状态(成功或者失败),可以通过接口每间隔一段时间查询自动排课的结果。
});
文章为作者独立观点,不代表股票交易接口观点