IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

ConcurrentAccessException avec un stateful session bean


Sujet :

Java EE

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 12
    Par défaut ConcurrentAccessException avec un stateful session bean
    Bonjour,

    J'ai une ConcurrentAccessException dans un stateful session bean avec le code suivant (j'ai simplifié) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MyServlet extends HttpServlet {
      @EJB
      private SLSBeanLocal slsbean;
     
      ...
     
      protected void processRequest(HttpServletRequest request, HttpServletResponse  response) {
        response.getOutputStream().write(slsbean.test());
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    @Stateless
    public class SLSBean implements SLSBeanLocal {
      @EJB
      private SLSBeanLocal slsbean;
     
      private String test() {
        try {
               sfsbean.init();
               String hello = sfsbean.getHello();
               ... some computation that can throw exceptions
               String world = sfsbean.getWorld();
               return hello + world;
             } catch (Exception e) {
               return sfsbean.handleError(e);
             }
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    @Stateful
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public class SFSBean implements SFSBeanLocal {
      private Locale lang;
      public void init() {
        ...
        lang = ...;
      }
     
      public String getHello(){
        ... computation/entitymanager usage, returns internationalized response (based on lang)
      }
     
      public String getWorld(){
        ... computation/entitymanager usage, returns internationalized response (based on lang)
      }
     
      public String handleError(Exception e){
        ... computation/entitymanager usage, returns internationalized response (based on lang)
      }
    }
    Le bean a un attribut de transaction REQUIRES_NEW, parce qu'une Exception qui rollback la transaction dans le stateless ne doit pas affecter les prochains appels au stateful bean (p.ex des appels pour traiter l'erreur).
    A cause de cet attribut de transaction, si le stateful bean était stateless, il serait repoolé après chaque appel, celà peut faire qu'une autre instance soit utilisée. C'est pourquoi je l'ai changé en statefull (à cause du champ lang).

    Mais maintenant j'ai de temps en temps des ConcurrentAccessExceptions, je ne sais pas pourquoi et je ne sais pas comment résoudre le cas.

    A ce que je comprends :

    Le servlet utilise un stateless bean, donc il utilisera n'importe quelle instance libre de SLSBean ou il en créera une nouvelle.
    Le stateless bean injecte le statefull lors de sa création et utilisera toujours le même SFSBean et il lui est exclusif (il ne sera jamais utilisé par une autre instance de SLSBean).
    Donc, comment est-ce que celà peut déclancher une ConcurrentAccessException sur le statefull bean?

  2. #2
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Par défaut
    Merci de penser à utiliser les préfixes.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    Salut,

    je pense que l'erreur viens de la servlet. Elle peut être exécutée par plusieurs

    Thread à la fois donc plusieurs appels simultanés aux beans ce qui genere cet erreur.

    Pour la resoudre, il faut faire implementer l'interface SingleThreadModel

    à ta servlet pour qu'elle soit exécutée une seule requête à la fois

Discussions similaires

  1. Vérifier l'existence d'un Session Bean Statefull dans le pool, avec un Stateless
    Par Djaydjay13 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 15/12/2010, 11h33
  2. Comment définir un home pour un Session Bean avec JDev 10g ?
    Par tresorkoul dans le forum JDeveloper
    Réponses: 1
    Dernier message: 17/09/2009, 10h52
  3. [EJB Stateful] Fonctionnement des EJB Stateful Session Bean
    Par T`lash dans le forum Java EE
    Réponses: 3
    Dernier message: 15/04/2008, 02h10
  4. [EJB Session] webservice et stateful session bean
    Par batotoba dans le forum Java EE
    Réponses: 4
    Dernier message: 16/07/2007, 23h22
  5. [EJB3] 'Passivation' d'un Stateful Session Bean
    Par metalpetsFR dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 03/07/2006, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo