【问题标题】:Rest web service synchronisationREST Web 服务同步
【发布时间】:2012-01-06 05:49:01
【问题描述】:

我是网络服务的新手。我编写了一个创建并返回 pdf 文件的 rest 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 文件会被过度写入。

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

谢谢

【问题讨论】:

    标签: web-services rest synchronization


    【解决方案1】:

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

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

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

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

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

    我还会确保您删除文件

    【讨论】:

    • 如果我在内存中构建文件并且多次调用服务,文件不会被覆盖
    • 写入内存时可能会发生冲突,但我想这取决于可用资源、处理请求的线程数和服务负载。我建议如果您非常担心,那么您应该使用随机数或 GUID 编写临时文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多