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 :

Stateless Bean session avec état ?


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Stateless Bean session avec état ?
    Salut à tous,

    J'aimerais éclaircir un point des EJB 3 stateless (sans état donc) car quelque chose m'échappe dans mon test :

    Mon interface distante expose des services liés à un panier dans lequel on ajoute des produits. On peut aussi consulter les produits de son panier:
    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
    23
    24
    25
    26
    27
    package fr.bnpp.pf;
     
    import java.util.List;
     
    import javax.ejb.Remote;
     
    import fr.bnpp.pf.request.Product;
     
    @Remote
    public interface ShoppingCartServices {
     
    	/**
             * Add a product to your shopping cart.
             * 
             * @param product
             *            the product to add
             */
    	void addProductToYourBasket(Product product);
     
    	/**
             * Returns the list of products added to the basket
             * 
             * @return a List made of Product objects
             */
    	List<Product> returnListOfProductInBasket();
     
    }
    Avec son implémentation stateless:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package fr.bnpp.pf;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.ejb.Stateless;
    import javax.ejb.TransactionManagement;
    import javax.ejb.TransactionManagementType;
     
    import fr.bnpp.pf.request.Product;
     
    /**
     * Session Bean implementation class ShoppingCartServices
     */
    @Stateless
    @TransactionManagement(TransactionManagementType.BEAN)
    public class ShoppingCartServicesImpl implements ShoppingCartServices {
     
    	private List<Product> basketOfProduct = null;
     
    	/**
             * Default constructor.
             */
    	public ShoppingCartServicesImpl() {
    		System.out.println("running ShoppingCartServicesImpl constructor");
    		basketOfProduct = new ArrayList<Product>();
    	}
     
    	@Override
    	public void addProductToYourBasket(Product product) {
    		System.out.println("running addProductToYourBasket method");
    		basketOfProduct.add(product);
    	}
     
    	@Override
    	public List<Product> returnListOfProductInBasket() {
    		System.out.println("running returnListOfProductInBasket method");
    		return basketOfProduct;
    	}
    }
    Tout ca dans un projet Eclipse :



    Et puis, un petit client pour tester ca qui ajoute 3 produits et consulte son panier:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package fr.bnpp.pf;
     
    import java.math.BigDecimal;
    import java.util.List;
    import java.util.Properties;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
     
    import fr.bnpp.pf.request.Product;
     
    public class MainTest {
     
    	public static void main(String[] args) {
     
    		Properties properties = new Properties();
    		properties.put("java.naming.factory.initial",
    				"org.jnp.interfaces.NamingContextFactory");
    		properties.put("java.naming.factory.url.pkgs",
    				"=org.jboss.naming:org.jnp.interfaces");
    		properties.put("java.naming.provider.url", "localhost:1099");
     
    		ShoppingCartServices shoppingCartServices = null;
     
    		try {
    			Context context = new InitialContext(properties);
     
    			shoppingCartServices = (ShoppingCartServices) context
    					.lookup("ShoppingCartServicesImpl/remote");
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
     
    		shoppingCartServices.addProductToYourBasket(new Product("4543543",
    				"IPOD", new BigDecimal(432.34)));
    		shoppingCartServices.addProductToYourBasket(new Product("99544",
    				"DVD PLAYER", new BigDecimal(2300.34)));
    		shoppingCartServices.addProductToYourBasket(new Product("23466", "TV",
    				new BigDecimal(12345.67)));
     
    		List<Product> basketOfProducts = shoppingCartServices
    				.returnListOfProductInBasket();
     
    	}
    }
    lui aussi dans un petit projet Eclipse:



    JBOSS démarre bien:
    21:24:49,453 INFO [JBossASKernel] jndi:ShoppingCartServicesImpl/remote
    21:24:49,453 INFO [JBossASKernel] Class:fr.bnpp.pf.ShoppingCartServices
    21:24:49,453 INFO [JBossASKernel] jndi:ShoppingCartServicesImpl/remote-fr.bnpp.pf.ShoppingCartServices
    21:24:49,453 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=ShoppingCartApplication.jar,name=ShoppingCartServicesImpl,service=EJB3) to KernelDeployment of: ShoppingCartApplication.jar
    21:24:50,296 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=ShoppingCartApplication.jar,name=ShoppingCartServicesImpl,service=EJB3
    21:24:50,312 INFO [EJBContainer] STARTED EJB: fr.bnpp.pf.ShoppingCartServicesImpl ejbName: ShoppingCartServicesImpl
    21:24:50,421 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

    ShoppingCartServicesImpl/remote - EJB3.x Default Remote Business Interface
    ShoppingCartServicesImpl/remote-fr.bnpp.pf.ShoppingCartServices - EJB3.x Remote Business Interface


    21:24:50,578 INFO [Http11Protocol] D�marrage de Coyote HTTP/1.1 sur http-127.0.0.1-8080
    21:24:50,656 INFO [AjpProtocol] Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009
    21:24:50,703 INFO [ServerImpl] JBoss (Microcontainer) [5.0.1.GA (build: SVNTag=JBoss_5_0_1_GA date=200902232048)] Started in 43s:203ms
    et lors de la première exécution du client de test on voit (dans les traces) :
    21:31:23,468 INFO [STDOUT] running ShoppingCartServicesImpl constructor
    21:31:23,625 INFO [STDOUT] running addProductToYourBasket method
    21:31:23,656 INFO [STDOUT] running addProductToYourBasket method
    21:31:23,671 INFO [STDOUT] running addProductToYourBasket method
    21:31:23,687 INFO [STDOUT] running returnListOfProductInBasket method
    La classe est donc instanciée et on exécute bien coté EJB ce qui est appelé par mon client de test.

    Par contre, je relance ma classe de test et là, on voit s'ajouter dans les traces de la console:
    21:33:58,687 INFO [STDOUT] running addProductToYourBasket method
    21:33:58,703 INFO [STDOUT] running addProductToYourBasket method
    21:33:58,718 INFO [STDOUT] running addProductToYourBasket method
    21:33:58,734 INFO [STDOUT] running returnListOfProductInBasket method
    --> donc pas de ré instanciation de mon EJB session stateless
    --> et quand j'inspecte ma liste de retour après l'exécution du second test:




    QUESTIONS :

    1. Est-ce normal que ma classe ne soit pas ré instanciée lors du second appel client alors que c'est un bean sesssion stateless ET que c'est un autre client?
    2. Est-ce normal que mon second appel client rapatrie une liste qui contient les produits ajoutés de lors de l'appel du premier client ?

    Merci à tous pour vos éclaircissements

  2. #2
    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
    Je crois que tu confond session bean Stateless et Stateful

    Un bean Stateless est partagé entre plusieurs clients c-a-d le meme bean peut etre utilisé pour differents clients. C'est pour cette raison que ton panier contient au second appel les données du premier et du second appel

    Pour implementer la logique du panier, tu devrais utiliser un bean Stateful qui, n'est utilisé uniquement par un seul client. Il conserve l'etat entre plusieurs appels et est detruit ( retirer du conteneur à la demande de l'utilisateur)

    NB : fais attention lors des etats passivate et activate

  3. #3
    Invité
    Invité(e)
    Par défaut
    En effet. J'ai modifié mon code en utilisant un bean stateful :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package fr.bnpp.pf;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.ejb.Stateful;
    import javax.ejb.TransactionManagement;
    import javax.ejb.TransactionManagementType;
     
    import fr.bnpp.pf.request.Product;
     
    /**
     * Session Bean implementation class ShoppingCartServices
     */
    @Stateful
    @TransactionManagement(TransactionManagementType.BEAN)
    public class ShoppingCartServicesImpl implements ShoppingCartServices {
     
    	List<Product> basketOfProducts = null;
     
    	/**
             * Default constructor.
             */
    	public ShoppingCartServicesImpl() {
    		System.out.println("running ShoppingCartServicesImpl constructor");
    		basketOfProducts = new ArrayList<Product>();
     
    	}
     
    	@Override
    	public void addProductToYourBasket(Product product) {
    		System.out.println("running addProductToYourBasket method");
    		basketOfProducts.add(product);
     
    	}
     
    	@Override
    	public List<Product> returnListOfProductInBasket() {
    		System.out.println("running returnListOfProductInBasket method");
    		return basketOfProducts;
    	}
    }
    Et j'ai simulé l'appel de 2 clients différents ; test que je lance plusieurs fois :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    package fr.bnpp.pf;
     
    import java.math.BigDecimal;
    import java.util.List;
    import java.util.Properties;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
     
    import fr.bnpp.pf.request.Product;
     
    public class MainTest {
     
    	public static void main(String[] args) {
     
    		Properties properties = new Properties();
    		properties.put("java.naming.factory.initial",
    				"org.jnp.interfaces.NamingContextFactory");
    		properties.put("java.naming.factory.url.pkgs",
    				"=org.jboss.naming:org.jnp.interfaces");
    		properties.put("java.naming.provider.url", "localhost:1099");
     
    		ShoppingCartServices shoppingCartServices = null;
    		ShoppingCartServices shoppingCartServices2 = null;
     
    		try {
    			Context context = new InitialContext(properties);
    			Context context2 = new InitialContext(properties);
     
    			shoppingCartServices = (ShoppingCartServices) context
    					.lookup("ShoppingCartServicesImpl/remote");
    			shoppingCartServices2 = (ShoppingCartServices) context2
    					.lookup("ShoppingCartServicesImpl/remote");
     
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
     
    		shoppingCartServices.addProductToYourBasket(new Product("4543543",
    				"IPOD", new BigDecimal(432.34)));
    		shoppingCartServices2.addProductToYourBasket(new Product("99879",
    				"SCOOTER", new BigDecimal(66663.98)));
     
    		shoppingCartServices.addProductToYourBasket(new Product("99544",
    				"DVD PLAYER", new BigDecimal(2300.34)));
     
    		List<Product> basketOfProducts = shoppingCartServices
    				.returnListOfProductInBasket();
     
    		List<Product> basketOfProducts2 = shoppingCartServices2
    				.returnListOfProductInBasket();
     
    		System.out.println("size list =" + basketOfProducts.size());
    		System.out.println("size list2 =" + basketOfProducts2.size());
     
    		shoppingCartServices.addProductToYourBasket(new Product("99544",
    				"DVD PLAYER", new BigDecimal(2300.34)));
     
    		basketOfProducts = shoppingCartServices
    		.returnListOfProductInBasket();
     
    		System.out.println("size list =" + basketOfProducts.size());
     
    	}
    }
    Et j'ai bien une nouvelle instance de créer à chaque appel d'un nouveau client :

    22:27:20,000 INFO [STDOUT] running ShoppingCartServicesImpl constructor
    22:27:20,062 INFO [STDOUT] running ShoppingCartServicesImpl constructor

    22:27:20,171 INFO [STDOUT] running addProductToYourBasket method
    22:27:20,187 INFO [STDOUT] running addProductToYourBasket method
    22:27:20,218 INFO [STDOUT] running addProductToYourBasket method
    22:27:20,234 INFO [STDOUT] running returnListOfProductInBasket method
    22:27:20,250 INFO [STDOUT] running returnListOfProductInBasket method
    22:27:20,281 INFO [STDOUT] running addProductToYourBasket method
    22:27:20,296 INFO [STDOUT] running returnListOfProductInBasket method
    22:40:24,771 INFO [STDOUT] running ShoppingCartServicesImpl constructor
    22:40:24,834 INFO [STDOUT] running ShoppingCartServicesImpl constructor

    22:40:24,943 INFO [STDOUT] running addProductToYourBasket method
    22:40:24,959 INFO [STDOUT] running addProductToYourBasket method
    22:40:24,974 INFO [STDOUT] running addProductToYourBasket method
    22:40:25,005 INFO [STDOUT] running returnListOfProductInBasket method
    22:40:25,021 INFO [STDOUT] running returnListOfProductInBasket method
    22:40:25,037 INFO [STDOUT] running addProductToYourBasket method
    22:40:25,052 INFO [STDOUT] running returnListOfProductInBasket method

  4. #4
    Invité
    Invité(e)
    Par défaut
    Mon test est une classe avec un main : ce n'est pas une webapp donc ma variable -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShoppingCartServices shoppingCartServices = null;
    ne vit pas longtemps : le temps du test...

    Ma question:

    Si je suis dans une webapp, et que je conserve en session par exemple une référence vers shoppingCartServices, est ce que je rappelerais bien la même instance coté serveur d'application / conteneur d'EJB avec mon bean stateful ?

    Merci à tous.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Salut !

    Oui, en effet, c'est l'intérêt même des EJB Stateful.

    Le principe des Stateful est de gérer justement les conversations longues (sur plusieurs pages web donc).

    Un bean Stateful maintient un état conversationnel avec le client du bean.

Discussions similaires

  1. [Integration] [Struts] Injecter un bean session avec Struts et Spring
    Par Barbidure dans le forum Spring
    Réponses: 2
    Dernier message: 23/09/2010, 11h03
  2. Réponses: 7
    Dernier message: 24/05/2009, 18h49
  3. Rafraîchir une jsp avec bean session perdu ; )
    Par stongolm dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 07/02/2007, 13h44
  4. Création d'une variable de session avec un ID
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 18/10/2004, 10h28
  5. [FLASH MX] Bouton avec états différents
    Par Chucky69 dans le forum Flash
    Réponses: 5
    Dernier message: 24/08/2004, 12h01

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