退出作为服务运行的例程时关闭 Java FileHandler
Closing Java FileHandler when quitting a routine that runs as a service
我有一个像这样安排计时器的小程序:
timer.schedule(new myRoutine(), 1000, 60000);
在 myRoutine
的 run()
方法中打开了 logger
并附加了 FileHandler
:
FileHandler fh = new FileHandler("app.log"),true);
logger.addHandler(fh);
由于应用程序没有真正的退出点(因为它作为服务运行),我没有机会关闭和删除 logger
的 FileHandler
,因此文件锁定(app.log.lck
) 仍然存在,从而在下次启动服务时生成新的日志文件 (app.log.1
)。
有没有办法确保 FileHandler
已关闭并删除?
也许我是盲人,但你为什么不做这样的事情:
class MyRoutine {
public void run() {
FileHandler fh = null;
try {
fh = ...
whatever else to do ...
} finally {
cleanup fh }
或者,也许,只是尝试使用资源?
你知道,即使 myRoutine(顺便说一句,错误的情况)是 "service";难道你不希望它被调用,做点什么然后离开吗?
您可以像这样添加关闭钩子:
在调度计时器的方法中:
public void scheduleFileTask() {
final FileHandler fh = new FileHandler("app.log"),true);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
fh.close();
}
});
timer.schedule(new MyRoutine(fh), 1000, 60000);
}
并且在MyRoutine.java
public class MyRoutine extends TimerTask {
private final FileHandler handler;
public MyRoutine(FileHandler hander) {
this.handler = handler;
}
public void run() {
// use handler here
handler.doSomething();
}
}
有关更多信息,您可以look up java docs
我有一个像这样安排计时器的小程序:
timer.schedule(new myRoutine(), 1000, 60000);
在 myRoutine
的 run()
方法中打开了 logger
并附加了 FileHandler
:
FileHandler fh = new FileHandler("app.log"),true);
logger.addHandler(fh);
由于应用程序没有真正的退出点(因为它作为服务运行),我没有机会关闭和删除 logger
的 FileHandler
,因此文件锁定(app.log.lck
) 仍然存在,从而在下次启动服务时生成新的日志文件 (app.log.1
)。
有没有办法确保 FileHandler
已关闭并删除?
也许我是盲人,但你为什么不做这样的事情:
class MyRoutine {
public void run() {
FileHandler fh = null;
try {
fh = ...
whatever else to do ...
} finally {
cleanup fh }
或者,也许,只是尝试使用资源?
你知道,即使 myRoutine(顺便说一句,错误的情况)是 "service";难道你不希望它被调用,做点什么然后离开吗?
您可以像这样添加关闭钩子:
在调度计时器的方法中:
public void scheduleFileTask() {
final FileHandler fh = new FileHandler("app.log"),true);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
fh.close();
}
});
timer.schedule(new MyRoutine(fh), 1000, 60000);
}
并且在MyRoutine.java
public class MyRoutine extends TimerTask {
private final FileHandler handler;
public MyRoutine(FileHandler hander) {
this.handler = handler;
}
public void run() {
// use handler here
handler.doSomething();
}
}
有关更多信息,您可以look up java docs