2009-07-28 3 views
3

スレッディングが行われる限り、以下のコードに問題があるかどうかを知る必要があります。私は、クラスレベルの変数が使用されない限り、スレッディングは問題ではないという印象を常に受け​​ていました。Threadsafe java servlet

public class UploadReferralImage extends HttpServlet 
{ 
    String CLASS_NAME = "UploadReferralImage"; 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    // Not handling Get, service must be invoked via Post. 
} 

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String METHOD_NAME = "doPost"; 
    LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, "Made it to the servlet"); 
    String reply = upload(request); 
    response.setHeader("Content-Type", "text/xml"); 
    response.getWriter().write(reply); 
    response.getWriter().flush(); 
    response.getWriter().close(); 
} 

public String upload(HttpServletRequest request) 
{ 

    String METHOD_NAME = "upload"; 
    LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, "Inside upload"); 
    String replyMsg = "Unable to call ImageUpload"; 

    try 
    { 
     ObjectInputStream inputFromApplet = new ObjectInputStream(request.getInputStream()); 
     FileBean fBean = (FileBean) inputFromApplet.readObject(); 

     inputFromApplet.close(); 
     LogHelper.debug(PACKAGE_NAME, CLASS_NAME, METHOD_NAME, fBean.getFileName()); 

     replyMsg = doImageUpload(fBean); 

     } 
     catch (IOException e) 
    { 
     e.printStackTrace(); 
      replyMsg = "Exception :" + e.toString(); 

    } 
     catch (ClassNotFoundException e) 
    { 
     e.printStackTrace(); 
      replyMsg = "Exception :" + e.toString(); 
    } 

    return replyMsg; 
} 

private String doImageUpload(FileBean fBean) 
{ 
     //Save the file and return the response 
     SaveCaseClientAgent saveCaseClientAgent = new SaveCaseClientAgent(); 
     saveCaseClientAgent.save(fBean); 
} 
+0

よく見えます。あなたはそれが信じられない理由がありますか? – skaffman

+0

アップロードメソッドが公開されていることに心配していましたが、どうしてそれを修正しなければならないのかわかりません。しかしこれまでのところ問題はありません。 – Keibosh

答えて

3

あなたは正しいです。

クラスレベルの変数を使用しない限り、Servletはスレッドセーフです。

は安全であるために、同様にあなたのクラスレベルStringfinalしたりすることがあります:

final String CLASS_NAME = "UploadReferralImage"; 
1

通常reentrantly一度に複数の要求を提供するサーブレットコンテナのサーブレットのインスタンスは1つだけです。ですから、インスタンス変数を使ってあるメソッドから別のメソッドに物事を渡すことは、競争条件のために、バッドのアイデアです。

最高の(最も簡単な)方法は、リクエストごとに一度インスタンスを作成してすべてに渡す独自の「ハンドラ」クラスを作成することです。コードでは、以下のようになります。MyHandler再利用するインスタンス変数で今すぐ

public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
    new MyHandler().doGet(req, resp); 
} 

はそれを取得として安全です。

+0

それで、私はそれを渡すことでそれをやっています。 パブリックvoid doGet(HttpServletRequest req、HttpServletResponse resp){ upload(request); } 問題が発生する可能性がありますか? – Keibosh

+0

いいえあなたのケースでは、2つの異なる要求の間に共有状態はありません(呼び出しスタックはスレッド間で共有されません。メソッドに渡される参照はスタック経由で共有されます)。それは、私の「トリック」が依然としてよりクリーンで広く使われているソリューションだという。 – Marcin

+0

+1ありがとう、ちょうど私が探していたもの –

関連する問題