java - 在java中使servlet线程安全

标签 java multithreading servlets

我的工作代码如下

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();
        }
    } 

我想让它线程安全,以便让它运行得更快。首先我要删除所有全局变量,但是当我这样做时,我收到错误

“发生了未处理的程序错误。请联系支持服务并报告问题”

我已经移动了它们,以便它们可以是本地的,如下

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();
        }
    } 

我在这里做错了什么吗?

我调用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;
    }

注意:我已经删除了第一部分中的全局变量并将它们放入类中

最佳答案

问题(或者至少是一个问题)是在第一个 finally block 中,您关闭了 out,但稍后尝试再次使用它。

这意味着您的 out.println(retdata) 语句始终在封闭的流上运行。

关于java - 在java中使servlet线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32392401/

相关文章:

java - 如何使用 EditText 编辑全局变量以将值传递给其他 Activity ?

javascript - 需要有关 HTTPSession 超时的帮助

C# Lazy <T> & 竞速初始化?

c - 使用 pthread_join 时出现段错误(退出代码 139)

java - Java volatile 是阻止缓存还是强制执行直写缓存?

java - ServletRequest 和 ServletContext 接口(interface)中 getRequestDispatcher() 中的单个方法

java - Java 对象的 null 属性是否使用内存?

java - 在什么情况下 ApplicationEventPublisher.publishEvent 不会触发?

java - 基于表单的身份验证登录 servlet 代码

java - 包 javax.servlet.annotation 不存在