5

私はWebmethodsIntegrationServerに取り組んでいます。内部には、BufferedWriterとFileWriterを使用してログファイル(server.log)にデータを書き込むための静的Javaメソッドの形式のJavaサービスがあります。静的メソッドコードは次のようになります。

public static void writeLogFile(String message) throws ServiceException{
    try {
        BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
        bw.write(message);
        bw.newLine();
        bw.close();
    } catch (Exception e) {
        throw new ServiceException(e.getMessage());
    }
}

注:
-コードは、例として簡略化されています。
-writeLogFileメソッドの宣言と属性を変更できません。つまり、常に次のようになります。public staticvoidwriteLogFile。この種の変更は禁止されています:publicsynchronizedvoidwriteLogFile。

writeLogFileメソッドが異なるインスタンスによって呼び出される可能性があるため、2つ以上のインスタンスが同時に同じリソース(server.log)にアクセスしないようにする必要があります。つまり、2つのインスタンスがserver.logにアクセスしようとした場合、一方のインスタンスは別のインスタンスがserver.logへのデータの書き込みを完了するのを待つ必要があります。

質問は次のとおりです。上記のコードを変更する必要がありますか?もしそうなら、私はどのような変更を行う必要がありますか?java staticメソッド内に「同期」を実装する必要がありますか?

@EJP:
では、同期を実装するのに最適なコードは次のうちどれですか?

1)

        FileWriter fw = new FileWriter("./logs/server.log", true);
        synchronized (fw) {
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(message);
            bw.newLine();
            bw.close();
        }

2)

        BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
        synchronized(bw) {
            bw.write(message);
            bw.newLine();
            bw.close();
        }

3)

        synchronized(util.class) {  //yes, the class name is started with lowercase
            BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true));
            bw.write(message);
            bw.newLine();
            bw.close();
        }

4)他の意見?

ありがとう。

4

3 に答える 3

2

メソッドを同期させるだけです。バイナリ互換性のため、メソッド シグネチャには影響しません。

于 2011-09-29T04:56:08.833 に答える
0

別の提案があります。同期はアスペクトとして扱うことができ、AOP フレームワークを使用して同じことを達成できると思います。これは、コードを変更しないという要件に準拠しています。しかし、私はそれについて100%確信が持てず、同じ質問を投稿しました. その反応を監視してください。

于 2011-09-29T06:25:26.767 に答える
-1

いいえ、BufferedWriter と FileWriter の基本クラスは java.io.Writer です。

書き込み操作ごとに独自のロックがあります

Object java.io.Writer.lock

The object used to synchronize operations on this stream. 

BufferedWriter bwを静的にし、静的メソッドで参照してみてください。したがって、すべての書き込みは同じWriterオブジェクトを介してファイルに書き込まれます

ところで、あなたはまだ別のログライブラリを発明していると思います...代わりにlog4jまたはあらゆる種類のログライブラリを使用できるかもしれません

于 2011-09-29T04:57:35.583 に答える