2011-12-02 34 views
1

多個客戶端發送寫入文件的請求,並期望響應成功或失敗。我想簡要描述在服務器端完成的工作。如何設計類及其方法

  1. 通過servlet類處理請求並調用另一個類繼續進行。
  2. FileWriter類被調用,並且此類執行文件寫入過程。
    a)。在上下文下創建目錄並在目錄中寫入*.txt文件
    b)。將上下文現有目錄中的一些文件複製到新創建的目錄中。
    c)。壓縮(*.zip)這個目錄

    class FileWriter {

    public synchronized writeFile(String contextPath) { 
         creates a directory & new file under context 
    
         copyFiles(path_to_directory); 
    } 
    
    private void copyFiles(String path_to_directory){ 
        copies files to /contextPath/directory/... from existingDirectory; 
    
    compressDir(Directory_path); // to compress the file 
    } 
    
    private void compressDir(String Directory_path) { 
         compress the newly created directory 
    } 
    

    }

正如你可以看到上面的類,有一個方法​​和兩個方法是private。只有synchrnized方法從servlet class調用其他方法從方法裏面調用。 那麼這是處理多個客戶端請求的好的/標準的方法嗎?

或者我應該直接從servlet class調用每種方法。請糾正我,並提出一個更好的方式來實施課程。

@Edit:req1來得快,例如創建目錄&文件 context/directory_1/file_1.txt

的平均時間 req2

來,並檢查directory_1已經存在,因此產生directory_2例如context/directory_2/file_1.txt

現在第二步是將文件從上下文複製到新創建的目錄。我告訴你directory_1directory_2 無關,所有新創建的目錄都從common_directory複製文件,例如, `context/common_directory/... to context/directory_1,context/directory_2'

和第三步將壓縮目錄:例如, directory_1.zip, directory_2.zip

+1

可以在兩個要求互相排斥或一個必須等​​待其他的行動完成,在你的情況下創建目錄等..? – havexz

+0

是的,你是對的。人們必須等待其他人創建目錄 – user1010399

+0

的舉動讓我舉個例子。 'req1'在n工作於'dir1/files1',同時'req2'進入,現在'req2'需要'req1'輸出或者依賴於'dir1/files1' – havexz

回答

1

查看上面的代碼,如果您從servlet中調用writeFile,那麼您的servlet將作爲單線程應用程序結束。

如果兩個工作在兩個單獨的目錄和單獨的文件上,並且保證沒有重疊,則應直接調用這兩種方法並溝入​​。看起來這是你的情況。所以你可以使用下面的方法:

Servlet Code 

{ 
    .... 
    String uniqDir = createUniqDir(); 
    copyFiles(uniqDir); 
    compressDir(uniqDir); 
} 

現在整個想法是創建uniq目錄名稱。現在有很多方法可以創建uniq目錄名稱。我將使用基於時間戳的一個。

String createUniqDir() { 
    // Use SimpleDateFormat or just millis from Date 
    // We just trying to be as uniq as possible. 
    String timeStampStr; 
    Date now = new Date(); 
    timeStampStr = "" + now.getTime(); // If using EPOC 
    // This soln if you wana use SimpleDateFormat 
    // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS"); 
    // timeStampStr = sdf.format(dt); 
    int counter = 1; 

    String dirToCreateStr = "some_prefix-" + timeStampStr; 
    File dirToCreate = new File(dirToCreate); 

    while(!dirToCreate.mkdir()) { 
    dirToCreateStr = "some_prefix-" + timeStampStr + "-" + counter; 
    file = new File(dirToCreate); 
    counter++; 
    } 
    return dirToCreateStr; 
} 

由於我們使用mkdir,這是原子彈,只返回true如果它能夠創建一個uniq的目錄。這個soln被優化爲在一毫秒內請求衝突的方式更少,我們不需要任何同步開銷。

您也可以使用一些counter來創建uniq名稱。但是如果你的櫃檯總是從一開始就開始的(即你沒有保持線程安全的狀態),那麼你就會遇到性能/準確性問題。

+0

你的意思是同步到'非同步'並直接從servlet調用其他兩個方法? – user1010399

+0

havexz,請檢查示例。因爲我已經準確地編輯了我的問題 – user1010399

+0

,您明白了我的觀點。主要目標是創建獨特的文件夾,並且您給了我一個很好的解決方案,但我們仍有'0.0001%'的重複機會,而我認爲它比'synchronization'更好。感謝您的時間和建議。 – user1010399

2

兩個建議:

  1. 不要將類命名爲相同於JDK已經存在的類。

  2. 不要使用這種方法調用方法,創建一個特定的方法,然後將它們放在一起,以清晰地顯示您的內涵。

    類FileProcessor/* FileUtil什麼的,但不是FileWriter的*/{

    公共同步的WriteFile(字符串的contextPath){// 下創建上下文目錄&新文件

    copyFiles(的contextPath); compressDir(contextPath); //壓縮文件
    }

    //將文件複製到/ contextPath/directory/... from existingDirectory;
    私人無效copyFiles(字符串path_to_directory){}

    //壓縮新創建的目錄 私人無效compressDir(字符串目錄路徑){}

+0

謝謝binary_runner,當然,我會關心類的重複,並且我正在考慮鏈式方法調用。感謝指出。 – user1010399