2012-01-06 110 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