• Home
  • Docker
  • Kubernetes
  • Java
  • Ubuntu
  • Maven
  • Big Data
  • CI
  • Install
  • Samples
  • Archived
EJB | Stateless Session Beans
  1. Introduction
  2. Définir un stateless bean
  3. Annotations @Local, @Remote, @LocalBean
    1. Annotation @Local
    2. Annotation @Remote
    3. Annotation @LocalBean
  4. Annotations @PostConstruct, @PreDestroy
    1. Annotation @PostConstruct
    2. Annotation @PreDestroy
    3. Exemple: Utilisation des annotations @PostConstruct/@PreDestroy
  5. Exemple: Utilisation d'un stateless bean
  6. Exemple: Accéder un stateless bean en utilisant DI (Dependency Injection)
  7. Exemple: Accéder un stateless bean en utilisant JNDI

  1. Introduction
    Un stateless bean ("stateless session bean") est une classe Java que le container EJB instancie et rend accessible ses méthodes publiques.
    Le stateless bean est accessible en utilisant l'injection automatique ou JNDI.

    Le container peut créer plusieurs instances du stateless bean pour répondre aux multiples invocations des méthodes publiques de la classe.
    Par conséquent, les variables d'instance de la classe ne doivent pas être utilisées pour conserver l'état du stateless bean entre différents appels du stateless bean.

    Mais, il est possible d'utiliser les variables d'instance (qui peuvent être initialisées à l'instanciation du stateless bean ou lors de l'appel d'une méthode du stateless bean).
    Typiquement, le but est pour une instance donnée le traitement sera fait une seule fois (par exemple, lire un fichier de configuration à l'instanciation du stateless bean et initialiser un tableau avec les données du fichier).
  2. Définir un stateless bean
    Pour définir une classe comme étant un stateless bean il faut, typiquement, annoter la classe avec l'annotation @Stateless.

    Code source (JBoss) de l'annotation @Stateless:

    L'annotation @Stateless accepte 3 paramètres :
    • String name()
      Le nom EJB du stateless bean.
      Ce nom sera utilisé pour référencer le stateless bean (avec DI ou JNDI).
      Par défaut, si aucune valeur n'est spécifiée pour ce paramètre, il sera initialisé par le nom de la classe du stateless bean (sans le nom du package).
      Typiquement, on s'en sert pour donner un nom plus explicite au stateless bean ou pour distinguer le stateless bean d'une autre Stateless qui a le même nom de la classe.

    • String mappedName()
      Ce paramètre permet de mapper le stateless bean à un nom global définit dans le container EJB (assez souvent un nom JNDI).

    • String description()
      Nom descriptif du stateless bean.

    Exemple :
  3. Annotations @Local, @Remote, @LocalBean

    Un stateless bean peut implémenter des interfaces métiers locales (@Local) ou distantes (@Remote).

    Les méthodes d'une interface métier locale (@Local) sont accessibles à l'intérieur de la même JVM.
    L'invocation de ces méthodes n'implique pas des appels RPC distants et ainsi les paramètres et les valeurs de retour des méthodes sont passés par référence.

    Les méthodes d'une interface métier distante (@Remote) sont typiquement invoquées par un code s'exécutant par une autre JVM.
    L'invocation de ces méthodes implique des appels RPC distants et ainsi les paramètres et les valeurs de retour des méthodes sont passés par valeur (sérialisation/désérialisation des paramètres et des valeurs de retour).

    Le stateless bean qui définit l'annotation @LocalBean expose toutes ses méthodes publiques au code s'exécutant par la même JVM.

    Notes : Un stateless bean qui ne définit pas les annotations @Local, @Remote, et @LocalBean et n'implémente pas des interfaces métiers (annotées par @Local ou @Remote) expose toutes ses méthodes publiques au code s'exécutant par la même JVM.
    1. Annotation @Local
      L'annotation @Local permet d'indiquer l'interface locale qui implémente les méthodes métiers du stateless bean.
      Ces méthodes peuvent être invoquées localement (même JVM) par d'autres objets (le passage des paramètres et des valeurs de retour des méthodes est fait par référence).

      Code source (JBoss) de l'annotation @Local:

      L'annotation @Local accepte 1 paramètre :
      • Class[] value()
        Indique les interfaces locales du stateless bean.

      L'annotation peut être utilisée avec des interfaces mais aussi avec des classes :
      • Si l'annotation @Local est utilisée avec une interface, alors l'interface est marquée comme une interface métier locale (aucun paramètre n'est requis dans ce cas pour l'annotation).



        Le stateless bean "MyClassL1" implémente deux interfaces métiers locales "MyInterfaceL11" et "MyInterfaceL12".

      • Si l'annotation @Local est utilisée directement avec le stateless bean, alors les interfaces spécifiées comme paramètres de l'annotation constituent les interfaces métiers locales.



        Le stateless bean "MyClassL2" définit les interfaces "MyInterfaceL21" et "MyInterfaceL22" comme étant des interfaces métiers locales (en utilisant l'annotation @Local).

    2. Annotation @Remote
      L'annotation @Remote permet d'indiquer l'interface distante qui implémente les méthodes métiers du stateless bean.
      Ces méthodes peuvent être invoquées par des objets distants n'appartenant pas à la même JVM du stateless bean (le passage des paramètres et des valeurs de retour des méthodes est fait par valeur).

      Code source (JBoss) de l'annotation @Remote:

      L'annotation @Remote accepte 1 paramètre :
      • Class[] value()
        Indique les interfaces distantes du stateless bean.

      L'annotation peut être utilisée avec des interfaces mais aussi avec des classes.
      • Si l'annotation @Remote est utilisée avec une interface, alors l'interface est marquée comme une interface métier distante (aucun paramètre n'est requis dans ce cas pour l'annotation).



        Le stateless bean "MyClassR1" implémente deux interfaces métiers distantes "MyInterfaceR11" et "MyInterfaceR12".

      • Si l'annotation @Remote est utilisée directement avec le stateless bean, alors les interfaces spécifiées comme paramètres de l'annotation constituent les interfaces métiers distantes.



        Le stateless bean "MyClassR2" définit les interfaces "MyInterfaceR21" et "MyInterfaceR22" comme étant des interfaces métiers distantes (en utilisant l'annotation @Remote).

    3. Annotation @LocalBean
      Le stateless bean qui utilise l'annotation @LocalBean expose toutes ses méthodes publiques au code s'exécutant par la même JVM y compris les méthodes des interfaces métiers distantes (annotées par l'annotation @Remote).

      Code source (JBoss) de l'annotation @LocalBean:

      L'annotation n'accepte aucun paramètre.

      Exemple (1) :

      Le stateless bean "MyClassLB1" expose les deux méthodes "foo" et "bar" au code s'exécutant par la même JVM.

      Exemple (2) :


      - Le stateless bean "MyClassLB2" expose les deux méthodes "foo" et "bar" au code s'exécutant par la même JVM.
      - Le stateless bean "MyClassLB2" expose aussi la méthode "foo" au code s'exécutant sur une autre JVM (clients distants).
  4. Annotations @PostConstruct, @PreDestroy
    Annotations qui gèrent le cycle de vie du stateless bean :

    1. Annotation @PostConstruct
      Code source (JBoss) de l'annotation @PostConstruct:

      Cette annotation permet de marquer une méthode du stateless bean qui va être exécutée (par le container EJB) directement après :
      • l'instanciation de la classe du stateless bean ; incluant l'exécution du code des blocs d'initialisation et du constructeur sans-arguments (constructeur par défaut).

      • et la résolution des dépendances du stateless bean.

      La méthode annotée par l'annotation @PostConstruct est garantie d'être exécutée avant les autres méthodes métiers du stateless bean.
    2. Annotation @PreDestroy
      Code source (JBoss) de l'annotation @PreDestroy:

      Cette annotation permet de marquer une méthode du stateless bean qui va être exécutée (par le container EJB) juste avant la destruction du stateless bean.
    3. Exemple: Utilisation des annotations @PostConstruct/@PreDestroy

      Voici la sortie dans la console JBoss quand le stateless bean est instancie :
  5. Exemple: Utilisation d'un stateless bean
    • Déclarer une classe utilitaire qui va servir comme exemple pour expliquer les différences de passage de paramètres entre les méthodes des interfaces métiers locales et distantes :


    • Déclarer une interface générique que les interfaces métiers locales et distantes vont hériter :


    • Déclarer une interface et l'annoter avec l'annotation @Local :


    • Déclarer une interface et l'annoter avec l'annotation @Remote :


    • Déclarer une classe et l'annoter avec l'annotation @Stateless :


  6. Exemple: Accéder un stateless bean en utilisant DI (Dependency Injection))
    Déclarer une classe et l'annoter avec l'annotation @Stateless :

    L'invocation de la méthode "testMyManagerLocal" donnera le résultat suivant :

    L'invocation de la méthode "testMyManagerRemote" donnera le résultat suivant :

    Notes :
    - Dans le cas de l'utilisation de l‘interface métier locale, l'instance de la classe "ValueHolder" est passée en référence.
    - Dans le cas de l'utilisation de l‘interface métier distante, l'instance de la classe "ValueHolder" est passée en valeur et cela même si le code est exécuté par la même JVM.
  7. Exemple: Accéder un stateless bean en utilisant JNDI
    Notes :
    - Voir les détails sur JNDI dans la page : JNDI.
    - Voir l'exemple comment utiliser JNDI (client distant) dans la page : JNDI (JBOSS AS).

    L'invocation de la méthode "testMyManagerRemote" donnera le résultat suivant :

    Notes : Vu que l‘interface métier distante est utilisée, alors l'instance de la classe "ValueHolder" est passée en valeur.

© 2025  mtitek