简体   繁体   English

在Java中使Servlet线程安全

[英]Make a servlet thread safe in java

I have working code as follows 我有如下工作代码

public class receive_meter_to_store extends HttpServlet {

    WSEMAMSTS EMAMService = new WSEMAMSTS();
    ItronEMAMStsBinding itronEMAM = EMAMService.getItronEMAMStsBinding();


    ItronAuthCredit lItronAuthCredit = new ItronAuthCredit();


    EANDeviceID lTerminalID = new EANDeviceID();


    EANDeviceID lClientID = new EANDeviceID();


    SimpleDateFormat itronDF = new SimpleDateFormat("yyyyMMddHHmmss");
    Date current_datetime = new Date();
    String s_current_datetime = itronDF.format(current_datetime);

    MsgID lMsgID = new MsgID();
    reuse_func gc_reuse_func = new reuse_func();
    curr_time gs_current_datetime = new curr_time("");

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String retdata = "Failure";

        try {
            retdata = add_meter_to_store(request, response);
        }
        finally {
            out.println(retdata);
            out.close();
        }
    } 

I want to make it thread safe, as in to make it run faster. 我想使其线程安全,以使其运行更快。 First I am to remove all the global variables, but when i do so, I get error 首先,我要删除所有全局变量,但是当我这样做时,会出现错误

"An unhandled program error has occured. Please contact the Support services and report the issue" “发生了未处理的程序错误。请联系支持服务并报告问题”

I have moved them so they can be local as follows 我已将它们移至其他位置,如下所示

public class receive_meter_to_store extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String retdata = "Failure";

        reuse_func lc_reuse_func = new reuse_func();

        try {

            WSECMPublic EMAMService = lc_reuse_func.getMeterWebService();

            ItronEMAMStsBinding itronEMAM = EMAMService.getItronEMAMStsBinding();
        }
        catch (Exception ex)
        {

            String ErrorMsg = ex.getMessage();

           out.println("Error" + ErrorMsg);
        }
        finally {
            out.close();
        }

        try {
            retdata = add_meter_to_store(request, response);
        }
        finally {
            out.println(retdata);
            out.close();
        }
    } 

Am I doing something wrong here? 我在这里做错什么了吗?

the class i am calling add_meter 我正在调用的类add_meter

public String add_meter_to_store(HttpServletRequest request, HttpServletResponse response)
    { 
        reuse_func lc_reuse_func = new reuse_func();

        try
        {

            WSECMPublic EMAMService = lc_reuse_func.getMeterWebService();

            ItronEMAMStsBinding itronEMAM = EMAMService.getItronEMAMStsBinding();


            ItronAuthCredit lItronAuthCredit = new ItronAuthCredit();

            EANDeviceID lTerminalID = new EANDeviceID();


            EANDeviceID lClientID = new EANDeviceID();


            SimpleDateFormat itronDF = new SimpleDateFormat("yyyyMMddHHmmss");
            Date current_datetime = new Date();
            String s_current_datetime = itronDF.format(current_datetime);


            MsgID lMsgID = new MsgID();

            curr_time ls_current_datetime = new curr_time("");

            // Declare MeterImportResponse Variable
            ItronMeterStsImportResp stsImportResp = new ItronMeterStsImportResp();

            // Call meterStsImport WebMethod
            stsImportResp = itronEMAM.meterStsImport(stsImportReq);



        }
        catch (Exception ex) {
            // TODO handle custom exceptions here
            String ErrorMsg = ex.getMessage();
            retdata = "Error : " + ErrorMsg;
        }

        return retdata;
    }

Note: i have removed the global variables in first part and put them in the class 注意:我已经在第一部分中删除了全局变量,并将其放在类中

The problem (or one problem, at least) is that in the first finally block, you close out , but then try to use it again later. 问题(或至少一个问题)是,在第一个finally块中,您关闭out ,但稍后尝试再次使用它。

This means that your out.println(retdata) statement is always operating on a closed stream. 这意味着您的out.println(retdata)语句始终在封闭的流上运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM