2013-07-31 19 views
1

我有一個網站,當用戶上傳PDF文件時,它會被髮送到服務器,做一些PDF渲染,並創建一個.png文件以顯示爲PDF預覽縮略圖。強制服務器等待,因爲圖像尚未寫入磁盤

問題是,當創建.png時,寫入磁盤比整個執行慢,導致圖像在網站上顯示爲錯誤,因爲它試圖訪問不存在的圖像(因爲代碼在寫入磁盤之前完成)。

我在.png創建後添加了一個Thread.sleep(2000),它似乎解決了這個問題。現在我的問題是,對於我的情況Thread.sleep(2000)是最好的代碼使用?我不知道該代碼是否會影響多個用戶訪問我的網站並上傳文件。

假設用戶A在UserB正常瀏覽時上傳文件。用戶A上傳文件後,用戶B是否經歷了2秒的延遲?

有沒有更好的方法讓我在這種情況下暫停執行代碼?

編輯:添加的代碼。我使用的PDF渲染器作爲我的圖書館:https://java.net/projects/pdf-renderer

public static void convertPDFtoImage() throws IOException { 
    RandomAccessFile raf = new RandomAccessFile (new File (rep.pathSamplePDF), "r"); 
    FileChannel fc = raf.getChannel(); 
    ByteBuffer buf = fc.map (FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
    PDFFile pdfFile = new PDFFile (buf); 

    PDFPage firstPage = pdfFile.getPage(1); 
    Rectangle2D r2d = firstPage.getBBox(); 
    int width = (int) r2d.getWidth(); 
    int height = (int) r2d.getHeight(); 

    Image pdfImage = firstPage.getImage(width, height, r2d, null, true, true); 

    BufferedImage imageToSave = (BufferedImage) pdfImage; 

    File outputFile = new File("public/pdfpreview/" + someName + ".png"); 
    ImageIO.write(imageToSave, "png", outputFile); //Trying to delay this part so that it can finish writing to disk 
    Thread.sleep(2000) //If I put this code here, it fixes my problem.  
} 
+0

UserB不應該體驗延遲,因爲'Thread.sleep'隻影響當前線程 –

+5

如何將文件寫入磁盤?如果您正在使用OutputStream,請嘗試flush()並關閉()它。這些操作之後,該文件應該存在。 – Matthias

+0

使用'ExecutorService'和'Map'作爲值'Future's作爲值 – fge

回答

2

假設用戶A上傳一個文件,而用戶B正常瀏覽。用戶A在 後上傳文件,用戶B是否經歷了2秒的延遲?如果用戶B的與用戶A的請求被通過同一線程,因爲大多數Web服務器使用一個單獨的線程來處理每個連接是不是這樣的處理

用戶B只會出現延遲。

Thread.sleep(2000)是最好的代碼嗎?

不,這可能不是一種很好的做事方式。除了捆綁CPU之外,當你沒有保證該文件準備就緒時,你顯式地讓線程等待2秒鐘,然後嘗試訪問該文件。嘗試利用Java的wait()和notify()Object methods來更好地實現併發性會更好。但是,我不知道這是否必要,因爲您應該知道寫入磁盤的時間是否完成(將返回一個java方法)。

+0

如何判斷寫入磁盤是否完成? – cYn

+0

你能發佈你用來保存文件的代碼嗎? – Joel

+0

是在原始文章中添加了它。 – cYn

相關問題