0

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

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

在a的run()方法中打开并附加 a:myRoutineloggerFileHandler

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

由于应用程序没有真正的退出点(因为它作为服务运行),我没有机会关闭和删除logger´s FileHandler,因此文件锁( )仍然存在,从而在下次启动时app.log.lck产生一个新的日志文件( )app.log.1服务。

有没有办法确保FileHandler关闭和删除?

4

2 回答 2

0

也许我是盲人,但你为什么不这样做:

class MyRoutine {
  public void run() {
    FileHandler fh = null;
    try {
      fh = ...
      whatever else to do ...
    } finally { 
      cleanup fh }

或者,也许,只是去尝试资源?

你知道,即使 myRoutine (顺便说一句,这里有错误的情况)是一种“服务”;你不期望它被调用,做某事然后离开吗?

于 2016-07-04T14:47:32.333 回答
0

您可以像这样添加关闭挂钩:

在安排计时器的方法中:

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();
    }
}

有关更多信息,您可以查找 java 文档

于 2016-07-04T14:55:25.277 回答