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 :

Multiple instance d'un EJB Singleton


Sujet :

Java EE

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut Multiple instance d'un EJB Singleton
    Bonjour,

    Je travail sur un système de datalogger. J'ai un serveur Java EE qui est chargé, entre autre, de récupérer des informations sur des automates.

    Afin d'éviter les connexions multiples, je voudrais avoir un seul objet par automate qui gère l'échange d'informations avec celui-ci. Ces objets doivent donc être instanciés au démarrage du serveur et effectuer les différentes requêtes vers l'automate nécessaire aux autres objets métier. Certaines requêtes peuvent être effectuées simultanément, d'autres non.

    Si je n'avais qu'un seul automate l'utilisation d'un EJB singleton serait l'idéal, en annotant les différentes méthodes avec @Lock read ou write.

    Le problème ici est que j'ai besoin de plusieurs de ces objets (un par automate) qui aurait chacun leur état. Sauf que le principe d'un singleton est justement qu'il n'existe qu'une seule instance d'une class.

    Si j'utilise un ejb Statefull, toutes les méthodes seront @Lock write; si j'utilise un simple pojo, je dois gérer tout l'accès multithread à la main et je perd le bénéfice d'un serveur java EE.

    Je suis pas très connaisseur de l'environnement java EE, il y a-t-il une solution simple pour ce genre de problème ?

    Voici un exemple de ce que je voudrais faire :

    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
    	public class Automate {
     
    		private String ip;
    		//...
    	}
     
    	@Singleton //??
    	public class Connection{
     
    		private Automate automate;
     
    		public void connect(Automate automate) {
    			this.automate = automate;
    			// ... connect to automate
    		}
     
    		@Lock(LockType.READ)
    		public int readValue() {
    			//..
    		}
     
    		@Lock(LockType.WRITE)
    		public void backup() {
    			//..
    		}
     
    		@Schedule(hour = "*", minute = "*", second = "*/1", info = "Every second timer")
    		private void updateData() {
    			//..
    		}
    	}
     
    	@Singleton
    	@Startup
    	public class AutomateManager{
     
    		@Inject 
    		private Provider<Connection> connectionProvider;
     
     
    		@PostConstruct
    		private void init() {
    			for (Automate automate : automateList) {
    				Connection connection = connectionProvider.get();
    				connection.connect(automate);
    				// ...
    			}
    		}
    	}
    Evidemment, dans cet exemple, je vais injecter à chaque fois la même instance de "Connection", ce qui ne conduira pas du tout au résultat souhaité.

  2. #2
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Il faut que tu crée une relation One to One entre ton entité Connection et ton Entité Automate.

    Je t'invite à consulter ces différentes ressources :
    - Lien 1 (blog fr sur Java EE)
    - Lien 2 (doc Oracle sur l'annotation OneToOne en)
    - Lien 3 (doc JBoss sur les entités fr)
    - Lien 4 (une question sur l'utilisation de OneToOne fr)
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Bonjour Drowan et merci pour ta réponse,

    Toutefois, je ne comprend pas trop en quoi l'annotation OneToOne va pouvoir m'aider. L'objet Connection n'est pas une entité et n'a pas vocation à être sauvegardé en bdd. C'est un objet contenant des méthodes métiers permettant la connexion à des services externes. J'ai besoin que ces objets possèdent un état (statut et référence de la connexion) et puissent gérer des accès simultanés et multithread, en gros tout ce que je pourrais faire avec un EJB Singleton, sauf qu'il m'en faut plusieurs de la même class.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Après de (longues) recherches, j'ai enfin trouvé un moyen de faire ce que je voulais.

    Résumé en deux lignes :

    Il n' y a pas d'EJB ou "Bean CDI" capabale de faire ça directement.
    Il y a moyen de contourner le problème en créant un Interceptor qui gère le verrou sur un bean managé et ainsi ajouté les annotationq @Lock directement sur un bean CDI.

    Voici le détail : https://www.knitelius.com/2016/01/25...ntrol-for-cdi/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FastReport] FastServer - multiple instance ISAPI
    Par powerlog dans le forum FastReport
    Réponses: 1
    Dernier message: 21/04/2008, 20h33
  2. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  3. Multiples instances d'un JInternalFrame.
    Par pierreact dans le forum NetBeans
    Réponses: 3
    Dernier message: 23/12/2007, 16h32
  4. Multiple instance de service Windows
    Par zubov dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/01/2007, 09h22
  5. [C++] DLL Multiples instances
    Par ouquoi dans le forum C++
    Réponses: 2
    Dernier message: 18/07/2006, 16h25

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