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 :
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é.
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); // ... } } }
Partager