1

私はTomcatサーバーを持っており、ファイルに書き込むコントローラーを持っています。データはリクエストに入っています。だから私の疑問は、サーバー内の複数のスレッドが同時に同じファイルに書き込み、問題を引き起こす可能性があるかどうかです?

私の要件は、すべてのリクエストが同じファイルにデータを追加することです。私は最後からスレッドを使用していません。

私のコードは次のとおりです。

File file = new File(fileName); 
try { 
    if(!file.exists()) { 
        file.createNewFile();    
    }
    InputStream inputStream = request.getInputStream();
    FileWriter fileWriter = new FileWriter(fileName,true);
    BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
    bufferWriter.write(IOUtils.toString(inputStream));
    bufferWriter.flush(); 
    bufferWriter.close(); 
}
4

2 に答える 2

2

このような問題には標準的な解決策があります。

singletonすべてのスレッド間で共有されるクラスを作成する必要があります。

これには、すべてのスレッドが単一のファイルに書き込むためのメッセージを入れるsingletonいくつかのBlockingQueue(例: ) があります。LinkedBlockingQueue

これsingletonはそれ自身でもあり、Threadそのrun()メソッド内では常にtake値をqueue取得し、必要なファイルに順次書き込みます。

于 2013-02-05T13:19:33.277 に答える
0

私の要件は、すべてのリクエストが同じファイルにデータを追加することです

リクエストごとにタスクを実行する (ロギングや、あなたの場合はファイルへのテキストの追加など) は、フィルター ( javax.servlet.Filter) を使用して実装するのが最適です。シングルトンを手動で作成する必要はなく、機能が必要かどうかに関係なくいつでもフィルターをオンまたはオフにすることができます。

ただし、ファイルへの同時アクセスを同期する必要があります。Andremoniy が指摘したように、フィルターが要求/応答をブロックしないように、独自のスレッドを使用してこれを行うことができます。

編集

javax.servlet.ServletContextファイルへの書き込みに使用される共有オブジェクトに関する 1 つの点:シングルトン オブジェクトを作成するよりも、このオブジェクトのインスタンスを に格納する方が適切です。これは、サーブレットを使用する Java Web アプリケーションの他のすべてのコンポーネントからオブジェクトにアクセスできるようにする必要がある場合の標準的な方法です。

于 2013-02-05T13:47:23.400 に答える