Deamon java_java daemon thread的实践应用

最近项目开发中遇到了一些不明的尴尬情况,程序运行很长时间都不退出,导致服务崩溃。经过分析,可能会是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的特性,解决其他线程在规定时间内已经全部退出时,程序自然也应该不再监控运行时间了,应该退出的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值