Servlet文件并发

时间:2012-02-14 16:01:05

标签: file servlets concurrency upload

我真的有一个非常简单的问题。 我为供应商编写了一个servlet来上传XML文件。 这些文件将写入服务器上的某个位置。 所有文件都使用时间戳重命名。

下面的代码存在并发问题的风险吗? 我问,因为我们收到供应商的文件,看起来像 他们有来自2个不同XML文件的内容

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
}        

public String getServletInfo() {
    return "Short description";
}// </editor-fold>

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    File dirToUse;
    boolean mountExists = this.getDirmount().exists();
    if (!mountExists) {
        this.log("MOUNT " + this.getDirmount() + " does not exist!");
        dirToUse = this.getDiras400();

    } else {
        dirToUse = this.getDirmount();
    }

    boolean useSimpleRead = true;
    if (request.getMethod().equalsIgnoreCase("POST")) {
        useSimpleRead = !ServletFileUpload.isMultipartContent(request);
    }

    if (useSimpleRead) {
        this.log("Handle simple request.");
        handleSimpleRequest(request, response, dirToUse);

    } else {
        this.log("Handle Multpart Post request.");
        handleMultipart(request, response, dirToUse);
    }
}   

protected void handleMultipart(HttpServletRequest request,
        HttpServletResponse response, File dir) throws IOException,
        ServletException {
    try {
        FileItemFactory fac = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(fac);
        List<FileItem> items = upload.parseRequest(request);

        if (items.isEmpty()) {
            this.log("No content to read in request.");
            throw new IOException("No content to read in request.");
        }

        boolean savedToDisk = true;
        Iterator<FileItem> iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();

            getFilename(request);
            File diskFile = new File(dir, this.getFilename(request));
            item.write(diskFile);

            if (!diskFile.exists()) {
                savedToDisk = false;
            }
        }

        if (!savedToDisk) {
            throw new IOException("Data not saved to disk.");
        }

    } catch (FileUploadException fue) {
        throw new ServletException(fue);

    } catch (Exception e) {
        throw new IOException(e.getMessage());
    }
}   

protected void handleSimpleRequest(HttpServletRequest request,
        HttpServletResponse response, File dir) throws IOException {
    // READINPUT DATA TO STRINGBUFFER
    InputStream in = request.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    StringBuffer sb = new StringBuffer();
    String line = reader.readLine();
    while (line != null) {
        sb.append(line + "\r\n");
        line = reader.readLine();
    }

    if (sb.length() == 0) {
        this.log("No content to read in request.");
        throw new IOException("No content to read in request.");
    }       

    //Get new Filename
    String newFilename = getFilename(request);
    File diskFile = new File(dir, newFilename);
    saveDataToFile(sb, diskFile);

    if (!diskFile.exists()) {
        throw new IOException("Data not saved to disk.");
    }
}

protected abstract String getFilename(HttpServletRequest request);

protected void saveDataToFile(StringBuffer sb, File diskFile) throws IOException {
    BufferedWriter out = new BufferedWriter(new FileWriter(diskFile));

    out.write(sb.toString());
    out.flush();
    out.close();
}

getFileName实现:

@Override
protected String getFilename(HttpServletRequest request) {
    Calendar current = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
    long currentTimeMillis = current.getTimeInMillis();

            System.out.println(currentTimeMillis);
    return "disp_" + request.getRemoteHost() + "_" + currentTimeMillis + ".xml";
}

无论如何,提前谢谢!

1 个答案:

答案 0 :(得分:0)

不存在同步问题,但可能存在竞争条件,例如,两个线程可能使用getFileName()方法返回相同的文件名