您的位置:首页 > 编程语言 > Java开发

java daemon thread的实践应用

2015-12-20 00:00 369 查看
最近项目开发中遇到了一些不明的尴尬情况,程序运行很长时间都不退出,导致服务崩溃。经过分析,可能会是sql查询永久性等待(与ORM有关)、maven打包前执行maven clean命令,也可能是还没有想到的原因。。。

为了解决这个大bug,至少在原因明了之前暂时应付。我写了一个监控程序运行时间并强制退出的功能,多少安心了。

附scala代码,java自然也是大同小异的。

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/1250285
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  daemon thread 实践