Log4Classicning

好读书 不求甚解 每有会意 便欣然忘食

捕捉定时任务线程的异常
2008年4月7日

用ScheduledThreadPoolExecutor来实现定时任务的一个问题就是如果run()方法执行中出现了异常,log上不会打印出任何报错信息,而线程和定时任务都会自动终止。这一点导致调试定时任务程序非常麻烦。

要打印出定时任务线程可能出现的问题,需要用到java.lang.Thread.UncaughtExceptionHandler这个接口,通过这个接口可以访问到某个线程抛出的异常,并可以进行一些操作。不过这个过程不是传统的异常处理,并不能对多线程任务抛出的异常进行捕捉和处理。所以,我认为主要还是起到调试的作用,可以借助logger在这里打印出errorMessage。

实现UncaughtExceptionHandler接口,需要覆盖uncaughtException(Thread t, Throwable e)方法。

@Override
public void uncaughtException(Thread t, Throwable e) {
	Logger logger = Logger.getLogger(t.getName());
	logger.info(e.getMessage());
	e.printStackTrace();
}


覆盖ScheduledThreadPoolExecutor类的afterExecute方法,加入UncaughtExceptionHandler,如下:

@Override
public void afterExecute(Runnable r, Throwable t){
	super.afterExecute(r, t);
	try {
		((Future<?>)r).get();
	} catch (InterruptedException e) {
	} catch (ExecutionException e) {
		new SchedulerExceptionHandler()
				.uncaughtException(Thread.currentThread(), e);
	}
}


由此,可以打印错误信息,方便调试。

« 看球归来早操 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Search

站点统计

  • 文章总数:732
  • 评论总数:2568
  • 引用总数:4
  • 浏览总数:5693
  • 留言总数:42
  • 当前主题:ClassicningDailyLog Style
  • 当前样式:footoo

网站收藏

图标汇集

  • Creative Commons License
  • Widgetize!
  • visitor stats

Powered By Z-Blog 1.8 Spirit Build 80722

2004 - 2007 Classicning.com. 苏ICP备06039259号.