0

現在、いくつかの値へのキーのマッピングを格納するWebサービスがあり、Webサービスによって受信されたコマンドのバックグラウンドロギングシステムを作成することができました。ここで、ログをファイルに保存するチェックポインターを実装する必要があります。これは、タイマータスクの拡張機能として実装しました。そのため、タイマーを使用して、チェックポインターが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

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 に答える
0

ユースケースに完全に適合するかどうかはわかりませんが、独自のログを作成するのではなく、非同期ログをサポートするログ フレームワークを使用することをお勧めします。たとえば、log4j は非同期アペンダーを提供します: http://www.slf4j.org/nlog4j/api/org/apache/log4j/AsyncAppender.html

于 2012-12-12T13:19:42.033 に答える