2009-07-28 8 views
3

J'ai besoin de savoir s'il y a des problèmes avec le code ci-dessous en ce qui concerne l'enfilage. J'ai toujours eu l'impression que tant que les variables de niveau classe ne sont pas utilisées, le threading n'est pas un problème.Servlet java Threadsafe

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

Ça a l'air bien. Avez-vous des raisons de croire que ce n'est pas? – skaffman

+0

J'étais juste inquiet à propos de la méthode de téléchargement étant publique, je ne sais pas pourquoi je l'ai fait, il faudra le corriger. Mais pas de problèmes avec ça jusqu'à présent. – Keibosh

Répondre

3

Vous avez raison.

Tant que vous n'utilisez pas de variables de niveau classe, votre Servlet sera thread-safe.

Pour être sûr, pourrait aussi bien faire votre classe de niveau Stringfinal:

final String CLASS_NAME = "UploadReferralImage"; 
1

En général, il n'y a qu'une seule instance d'un servlet dans le conteneur de servlet qui sert rentrante plusieurs demandes à la fois. Utiliser des variables d'instance pour passer d'une méthode à une autre est donc une idée de base en raison des conditions de course.

Le meilleur moyen (et le plus facile) de le résoudre est d'écrire votre propre classe de "gestionnaire" que vous instanciez une fois par requête et lui transmettez tout. Dans le code, il ressemble à ça:

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

maintenant dans MyHandler en réutilisant les variables d'instance est aussi sûre qu'elle obtient.

+0

Donc avec la façon dont je le fais en passant public void doGet (HttpServletRequest req, HttpServletResponse resp) { télécharger (demande); } pourrait potentiellement causer un problème? – Keibosh

+0

Non. Dans votre cas, il n'y a pas d'état partagé entre deux requêtes différentes (les piles d'appels ne sont pas partagées entre les threads, les références passées aux méthodes sont partagées via la pile). Cela dit, mon «truc» est toujours une solution plus propre, plus largement utilisée. – Marcin

+0

+1 merci, juste ce que je cherchais –

Questions connexes