当两个不同的用户同时访问代码时,来自jsps的请求参数发生变化

Request parameters coming from jsps are changed when two different users access the code same time

public String generateDataPDF() {
    System.out.println("Inside generate PDF");
    String filePath = "";
    HttpSession sess = ServletActionContext.getRequest().getSession();
    try {


        sess.setAttribute("msg", "");
        if (getCrnListType().equalsIgnoreCase("F")) {
            try {
                filePath = getModulePath("CRNLIST_BASE_LOCATION") + File.separator + getCrnFileFileName();
                System.out.println("File stored  path : " + filePath);
                target = new File(filePath);
                FileUtils.copyFile(crnFile, target);
            } catch (Exception e) {
                System.out.println("File path Exception " + e);
            }
        }


        System.out.println("Values from jsp are : 1)Mode of Generation : " + getCrnListType() + " 2)Policy Number : " + getCrnNumber() + " 3)Uploaded File Name : " + getCrnFileFileName() + " 4)LogoType : " + getLogoType()
                + " 5)Output Path : " + getOutputPath() + " 6)Type of Generation : " + getOptionId() + " 7)PDF Name : " + getPdfName());

        String srtVAL = "";

        String arrayVaue[] = new String[]{getCrnListType(), getCrnListType().equalsIgnoreCase("S") ? getCrnNumber() : filePath, getLogoType().equalsIgnoreCase("WL") ? "0" : "1",
            getOutputPath(), getGenMode(), getRenType()};

        //INS DB Connection
        con = getInsjdbcConnection();

        ArrayList selectedCRNList = new ArrayList();
        String selectedCRNStr = "";
        selectedCRNStr = getSelectedVal(selectedCRNStr, arrayVaue[1]);

        String[] fileRes = selectedCRNStr.split("\,");
        if (fileRes[0].equalsIgnoreCase("FAIL")) {
            System.out.println("fileRes is FAIL beacause of other extension file.");
            sess.setAttribute("pr", "Please upload xls or csv file.");
            return SUCCESS;
        }

        System.out.println("List file is : " + selectedCRNStr);

        String st[] = srtVAL.split("[*]");
        String billDateStr = DateUtil.getStrDateProc(new Date());
        Timestamp strtPasrsingTm = new Timestamp(new Date().getTime());
        String minAMPM = DateUtil.getTimeDate(new Date());
        String str = "";
        String batchID = callSequence();
        try {

            System.out.println("Inside Multiple policy Generation.");
            String userName=sess.getAttribute("loginName").toString();
            String list = getProcessesdList(userName);
            if (list != null) {
                System.out.println("list is not null Users previous data is processing.....");
                //setTotalPDFgNERATEDmSG("Data is processing please wait.");
                sess.setAttribute("pr","Batch Id "+list+" for User " + userName + " is currently running.Please wait till this Process complete.");
                return SUCCESS;
            }

            String[] policyNo = selectedCRNStr.split("\,");

            int l = 0, f = 0,counter=1;
            for (int j = 0; j < policyNo.length; j++,counter++) {

                String pdfFileName = "";
                int uniqueId=counter;
                globUniqueId=uniqueId;
                insertData(batchID, new Date(), policyNo[j], getOptionId(), userName,uniqueId);

                System.out.println("Executing Proc one by one.");
                System.out.println("policyNo[j]" + policyNo[j]);
                System.out.println("getOptionId()" + getOptionId());
                System.out.println("seqValue i.e batchId : " + batchID);
             }
                  str = callProcedure(policyNo[j], getOptionId(), batchID);
                String[] procResponse = str.split("\|");
                for (int i = 0; i < procResponse.length; i++) {
                    System.out.println("Response is : " + procResponse[i]);
                }

                if (procResponse[0].equals("SUCCESS")) {
                    Generator gen = new Generator();

                    if (getPdfName().equalsIgnoreCase("true")) {
                        System.out.println("Checkbox is click i.e true");
                        pdfFileName = procResponse[1];
                    } else {
                        System.out.println("Checkbox is not click i.e false");
                        String POLICY_SCH_GEN_PSS = getDetailsForFileName(userName, policyNo[j], batchID);
                        String[] fileName = POLICY_SCH_GEN_PSS.split("\|");
                        if (getLogoType().equals("0") || getLogoType().equals("2")) {
                            System.out.println("If logo is O or 1");
                            pdfFileName = fileName[1];
                        } else if (getLogoType().equals("1")) {
                            System.out.println("If logo is 2");
                            pdfFileName = fileName[0];
                        }

                    }

                    b1 = gen.genStmt(procResponse[1], procResponse[2], "2", getLogoType(), "0", pdfFileName,"1",userName,batchID);
                    l++;
                    updateData(uniqueId,batchID, "Y");
                } else {
                    f++;
                    updateData(uniqueId,batchID, "F");
                }

            }        
            sess.setAttribute("pr","Total "+l+" "+getGenericModulePath("PDF_RES1") + " " + " " + getGenericModulePath("PDF_RES2") + " " + f);
        }catch (Exception e) {
            updateData(globUniqueId,batchID, "F");
            System.out.println("Exception in procedure call");
            setTotalPDFgNERATEDmSG("Fail");
            e.printStackTrace();
            sess.setAttribute("pr", "Server Error.");
            return SUCCESS;
        }
    }catch (Exception ex) {
        ex.printStackTrace();
        sess.setAttribute("pr", "Server Error.");
        return SUCCESS;
    }
    System.out.println("Above second return");
    return SUCCESS;
}

GenerateDataPDF 方法根据参数生成 PDF,即 ProductType(GenMode)、CrnList(上传到 excel 文件...)当只有单个用户生成 PDF 时,代码工作正常。但是如果两个不同的用户(用户和角色在应用程序中分配)启动进程同时请求参数将被覆盖!假设第一个用户请求产品 1 的 50 个客户的 pdf。用户 1 的流程仍然是 运行,第二个用户请求产品 2。现在生成了 User1 的 pdf,但对于 product2 ......!这里 batchId 对于每个 request.One table 都是唯一的,在 batch_id 处维护,所有 pdf,生成标志都在那里维护。我该如何解决?

根据您的评论,这就是我要做的,这可能不是最好的方法!

首先:创建一个函数来在开始时收集所有数据。生成 PDF 时,您不应该 modify/update/create 任何内容。 IE:array/list collectPDFData() 应该返回一个 array/list.

其次:使用像synchronized boolean generatePDF(array/list)

这样的同步方法

"Synchronized" 方法使用监视器锁或内部锁来管理同步,因此当使用同步时,每个方法共享相应对象的相同监视器。

注意:如果您使用 Synchronize,以单独的方式收集所有数据可能没有用,但我认为将小函数专门用于特定任务是一种很好的做法。

因此,您的代码应该稍微重构一下。