spring onApplicationEvent 定时执行访问数据库时,网路异常处理

WTPMCheng 2016-10-25 02:53:20
背景:
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的代码;
...全文
737 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
WTPMCheng 2016-11-02
  • 打赏
  • 举报
回复
自己帮顶下!!!
WTPMCheng 2016-10-25
  • 打赏
  • 举报
回复
该项目采用tomcat启动

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧