退出作为服务运行的例程时关闭 Java FileHandler

Closing Java FileHandler when quitting a routine that runs as a service

我有一个像这样安排计时器的小程序:

timer.schedule(new myRoutine(), 1000, 60000);

myRoutinerun() 方法中打开了 logger 并附加了 FileHandler:

FileHandler fh = new FileHandler("app.log"),true);
logger.addHandler(fh);

由于应用程序没有真正的退出点(因为它作为服务运行),我没有机会关闭和删除 loggerFileHandler,因此文件锁定(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