2013-02-05 50 views
1

我有一個tomcat服務器,我有一個控制器寫入文件,數據進入請求。所以我懷疑服務器中的多個線程是否可以同時寫入同一個文件並導致問題?在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(); 
} 
+0

你打開每個請求上的文件或全部共享同一個作家? – Mauricio

+0

現在我每次打開文件。我的代碼如下-File file = new File(fileName); \t \t嘗試{ \t \t \t如果{ \t \t \t \t file.createNewFile()(file.exists()!); \t \t \t \t \t \t \t} \t \t \t \t \t \t的InputStream的inputStream =請求。的getInputStream(); \t \t \t \t \t \t FileWriter fileWriter = new FileWriter(fileName,true); \t \t \t \t \t \t BufferedWriter bufferWriter = new BufferedWriter(fileWriter); \t \t \t bufferWriter.write(IOUtils.toString(inputStream)); \t \t \t bufferWriter.flush(); \t \t \t bufferWriter.close(); \t \t} – user1643001

回答

2

有此類問題的標準解決方案。

您必須創建singleton類,它將在所有線程之間共享。

這個singleton將有一些BlockingQueue(例如LinkedBlockingQueue),其中所有線程將其消息寫入單個文件。

singleton由它自也將是Thread及其run()方法內它就會不斷地從queuetake值,並依次把它寫入所需的文件。

+0

在'ServletContext'中存儲對象的實例(應該寫入文件)比創建單例更好。當您需要一個對象可被所有其他組件訪問時,這是Java Web應用程序中的一種方式。 – Uooo

0

我的要求是,所有的請求將數據追加到同一個文件

執行任務的每個請求(如日誌或在您的情況下,添加文本文件)可以使用得到最佳實施過濾器(javax.servlet.Filter)。您不必手動創建單例,並且您可以在需要其功能時打開或關閉過濾器。

但是,您仍然需要同步對文件的併發訪問。正如Andremoniy指出的那樣,您可以使用自己的Thread來完成此操作,以便您的過濾器不會阻止請求/響應。

編輯

一件事用於寫入該文件的共享對象:這是更好地在javax.servlet.ServletContext存儲該對象的實例,而不是創建一個單獨的對象。如果您需要使用servlet的Java Web應用程序中的所有其他組件都可以訪問對象,那麼這是標準方法。

+0

所以不會tomcat服務器照顧同步線程? – user1643001

+0

@ user1643001當然不是。它竭盡全力確保它們都可以同時運行。否則它不能很好地工作,你不會使用它。 – EJP

+0

我們可以使用Synchronized block嗎? – user1643001