最近项目开发中遇到了一些不明的尴尬状况,程序运行很长时间都不退出,致使服务崩溃。通过分析,可能会是sql查询永久性等待(与ORM有关)、maven打包前执行maven clean命令,也多是尚未想到的缘由。。。java
为了解决这个大bug,至少在缘由明了以前暂时应付。我写了一个监控程序运行时间并强制退出的功能,多少安心了。sql
附scala代码,java天然也是大同小异的。
maven
import org.joda.time.DateTime import core.traits.LogTrait object ExitKit extends LogTrait { val secondsNum = 1 //s val minuteNum = 60 //s val hourNum = 3600 //s val dayNum = 3600 * 24 //s /** * ms为单位 */ val sleepTime = 10000 /** * 程序异常退出时的code */ val exitCode = 3 def monitorExit() { val excuteTime = sys.props.get("sys.maxExcuteTime") if (excuteTime != None) { logger.info("进行运行时间控制") val timeType = sys.props.getOrElse("sys.timeType", "s").toLowerCase var timeLast = excuteTime.get.toInt logger.info("sys.timeType:{}", timeType) if (timeType == "s") {} else if (timeType == "m") { timeLast = timeLast * minuteNum } else if (timeType == "h") { timeLast = timeLast * hourNum } else if (timeType == "d") { timeLast = timeLast * dayNum } logger.info("sys.maxExcuteTime:" + timeLast + " s") /** * 一个守护线程,若是程序长时间不退出,能够经过它来使程序强行退出,退出时code为 exitCode=3 */ val daemonThread = new Thread(new Runnable { def run() { val start = System.currentTimeMillis() var end = start while (true) { end = System.currentTimeMillis() logger.info("end-start:" + (end - start) / 1000 + " s") /** * 其余地方也能够控制线程是否退出,经过设置sys.othersShut为true */ val othersShut = sys.props.getOrElse("sys.othersShut", "false") if (othersShut == "true") return if ((end - start) / 1000 > timeLast) { try { logger.info("System.exit(3),缘由:(end - start) / 1000 > " + timeLast.toString + " --- start:{},end:{}", new DateTime(start).toString("yyyy-MM-dd HH:mm:ss"), new DateTime(end).toString("yyyy-MM-dd HH:mm:ss")) } catch { case t: Throwable => logger.info("System.exit(3),缘由:(end - start) / 1000 > " + timeLast.toString) } System.exit(exitCode) } try { Thread.sleep(sleepTime) logger.debug("--- monitorExit 休息{}秒 ---", sleepTime.toString) } catch { case t: Throwable => } } } }) daemonThread.setDaemon(true) println("--thread --- isDaemon? :" + daemonThread.isDaemon) daemonThread.start() } else { logger.info("进行运行时间控制") } } }
功能也不是多么厉害,主要涉及了Daemon
Thread的特性,解决其余线程在规定时间内已经所有退出时,程序天然也应该再也不监控运行时间了,应该退出的问题。
线程
本文出自 “沐浴心情” 博客,请务必保留此出处http://lj3331.blog.51cto.com/5679179/1250285scala