0

我目前有一个 Web 服务,它存储键到某些值的映射,我设法创建了一个 Web 服务接收到的命令的后台日志记录系统。现在我必须实现一个检查指针,它将日志存储到一个文件中,我已经将它实现为 Timer Task 的扩展。所以我想我可以使用计时器来安排检查指针每 20 分钟左右执行一次任务。我的问题是,除了调用检查指针之外,我还必须测试对服务的任何调用是否仍在处理中,等待它完成,然后阻止 web 服务,直到我发送恢复命令,即静默方法。

public class MyCheckpointer extends TimerTask implements Checkpointer {

ObjectOutputStream out; 
FileOutputStream file;
MyLogger log;

public MyCheckpointer(MyLogger l)
{
    File log_txt = new File("./log.txt");
    try {
        this.file = new FileOutputStream(log_txt);
        this.out = new ObjectOutputStream(this.file);

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    this.log = l;

}

@Override
public void run() {
    // TODO Auto-generated method stub
    this.writeLog();
}

private void writeLog()
{
    ArrayList<LogRecord> l = this.log.getArray();
    Iterator<LogRecord> e = l.iterator();
    do
    {
        try {
            out.writeObject(e.next());
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }while(e.hasNext());
}

}
4

2 回答 2

0

我不知道它是否完全适合您的用例,但我建议使用支持异步日志记录的日志框架,而不是滚动您自己的日志框架。例如,log4j 提供了一个异步追加器:http ://www.slf4j.org/nlog4j/api/org/apache/log4j/AsyncAppender.html 。

于 2012-12-12T13:19:42.033 回答
0

Web 服务实现和 MyCheckpointer 类可以共享一个同步对象。例如 java.util.concurrent.Lock:

Lock lock = new ReentrantLock();

那么他们两个都应该调用:

lock.lock();
service the command and log/write logs to file
lock.unlock();
于 2012-12-12T14:20:01.260 回答