2012-01-06 181 views
0

我是網絡服務新手。我已經寫了一個創建和返回PDF文件的休息Web服務。我的代碼如下其他Web服務同步

@Path("/hello") 
public class Hello { 

@GET 
    @Path("/createpdf") 
    @Produces("application/pdf") 
    public Response getpdf() { 
     synchronized(this){ 

     try { 
       OutputStream file = new FileOutputStream(new File("c:/temp/FirstPdf5.pdf")); 

       Document document = new Document(); 
       PdfWriter.getInstance(document, file); 
       document.open(); 
       document.add(new Paragraph("Hello Kiran")); 
       document.add(new Paragraph(new Date().toString())); 

       document.close(); 
       file.close(); 

      } catch (Exception e) { 

       e.printStackTrace(); 
      } 

     File file1 = new File("c:/temp/FirstPdf5.pdf"); 

     ResponseBuilder response = Response.ok((Object) file1); 
     response.header("Content-Disposition", 
       "attachment; filename=new-android-book.pdf"); 
     return response.build(); 
     } 
    } 

} 

如果多個客戶端試圖同時調用Web服務,它會影響我的代碼嗎? 我的意思是,如果客戶端A使用Web服務,並在同一時間如果客戶端B嘗試使用Web服務將PDF文件獲取寫過。

如果我的問題是不妥當的,請讓我知道

感謝

回答

0

當你正在寫的文件到硬盤上多次調用該服務將導致覆蓋的文件或導致例外情況該文件已被使用。

如果文件對於所有用戶都是相同的,那麼您只需要讀取文件而不是每次寫入文件。

但是,如果該文件是爲每個用戶不同,你可以嘗試的2個下列選項之一:

你可以建立在內存中的文件,然後直接寫二進制響應響應流。

或者,您可以使用唯一的名稱創建文件,這可能是一個GUID或一個隨機數,這將確保您不會在到達服務器的多個呼叫之間發生衝突。

我還要確保你刪除的文件

+0

如果我建立內存,如果多次調用該服務的文件,willn't文件overwitten – 2012-01-06 06:22:37

+0

有機會的話,在寫存儲器時,你可以有衝突,但我想這取決於可用資源,處理請求的線程數量和服務負載。我建議如果你非常擔心,那麼你應該使用隨機數字或GUID來編寫臨時文件。 – SCB 2012-01-10 21:45:35