休息Web服务同步

时间:2012-01-06 05:49:02

标签: web-services rest synchronization

我是网络服务新手。我写了一个休息网络服务,创建并返回pdf文件。我的代码如下

@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文件将被覆盖。

如果我的问题不正确,请告诉我

由于

1 个答案:

答案 0 :(得分:0)

当您将文件写入硬盘时,对服务的多次调用将导致文件被覆盖或导致文件已被使用的异常。

如果所有用户的文件相同,那么您只需要读取文件而不是每次都写入。

但是,如果每个用户的文件不同,您可以尝试以下两个选项之一:

您可以在内存中构建文件,然后将二进制响应直接写入响应流。

或者,您可以使用唯一名称创建文件,这可以是GUID或随机数,这可以确保您在到达服务器的多个呼叫之间永远不会发生冲突。

我还会确保您删除文件