2015-09-04 60 views
1

我已經工作的代碼如下做一個servlet線程安全的Java中

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

注:我已刪除在第一部分中的全局變量,並把他們在課堂

+0

你得到的例外是什麼? –

+0

當我調用一個方法,stsImportResp = itronEMAM.meterStsImport(stsImportReq);我得到異常錯誤發生未處理的程序錯誤。請聯繫支持服務並報告問題 – Ruth

+0

您必須嘗試阻止並最終與它們關聯。如果在你的第一次嘗試塊catch塊中有任何的錯誤,那麼最終會失敗,最後你會關閉。它會處理第二個嘗試塊,然後終止塊。但是在這種情況下,如果出局已經很平穩,並且會導致異常。 – RajSharma

回答

2

的問題(或一個問題,至少)是在第一個finally區塊中,您關閉out,但稍後嘗試再次使用它。

這意味着您的out.println(retdata)聲明始終在封閉流中運行。

+0

是肯定的,如果我在第一個地方遇到異常,我希望它退出 – Ruth

+0

@Ruth請參閱更新以回答:無論是否存在異常,問題都會發生。 –

+0

你可以在上面的鏈接中查看我的代碼嗎? – Ruth