spring onApplicationEvent 定时执行访问数据库时,网路异常处理
背景:
spring + spring mvc + mybatis的项目
代码:
public class Init implements ApplicationListener<ContextRefreshedEvent> {
@Resource(name="bussinessService")
private IBussinessService bussinessService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
Thread accessDbThread = new Thread(new AccessDbThread());
accessDbThread.setDaemon(true);
accessDbThread.start();
}
private class AccessDbThread implments Runnable{
@Override
public void run(){
while(true){
List<ItemsInfo> itemInfos = bussinessService.getAllItems();
System.out.println("result:"+itemInfos.size);
Thread.sleep(3000);
}
}
}
}
问题:
项目启动后会每隔3S执行一次bussinessService.getAllItems();操作,在执行bussinessService.getAllItems();期间若访问数据库的网络出现异常(断开),控制台会输出:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communcations link failure...错误
线程已经终止,隔断时间后将网络恢复,bussinessService.getAllItems();代码不会再继续执行。。
个人分析:
1)在java project中采用同样的AccessDbThread 代码,通过控制台启动后按照上述步骤,断开网络再恢复网络,线程仍然会正常执行;
2)个人认为是不是采用ApplicationListener<ContextRefreshedEvent>后,AccessDbThread 线程只会在项目初始化完成后启动,而在控制台(main)方法中测试时,是不是会不停的执行AccessDbThread 代码,因为出现的异常为底层jdbc访问出现的异常。
3)采用java的观察者模式可以重新恢复异常的线程,但此异常仅仅为catch可捕获的异常,底层异常暂不可行;
需求:
1)如何实现在ApplicationListener<ContextRefreshedEvent>后,执行一段定时器代码(隔断时间访问数据库),网络出现异常后可继续执行AccessDbThread的代码;