Ik heb (denk ik) een probleempje met concurreny, en mogelijk met de hele opzet van deze schoolopdracht.
Ik heb een remote stateless session bean die in de meest basale vorm 1 HashMap en 2 methodes add en delete, voor resp. het toevoegen en verwijderen van boeken.
Nu zou je zeggen dat hij 100 boeken toevoegt en dan verwijderd, maar vaak blijven er boeken in de HashMap bestaan nadat de client klaar is, ze blijven dus 'over'.
Wie kan dit verklaren? Het heeft er misschien mee te maken dat voor iedere methode aanroep er een nieuwe EJB uit de pool wordt gehaal, maar het fijne weet ik er niet vanaf, iemand die dit kan uitleggen?
Ik gebruik JBoss 4.4.2GA icm EJB3 met annotations.
Dan de client:
EJB:
Ik heb een remote stateless session bean die in de meest basale vorm 1 HashMap en 2 methodes add en delete, voor resp. het toevoegen en verwijderen van boeken.
Nu zou je zeggen dat hij 100 boeken toevoegt en dan verwijderd, maar vaak blijven er boeken in de HashMap bestaan nadat de client klaar is, ze blijven dus 'over'.
Wie kan dit verklaren? Het heeft er misschien mee te maken dat voor iedere methode aanroep er een nieuwe EJB uit de pool wordt gehaal, maar het fijne weet ik er niet vanaf, iemand die dit kan uitleggen?
Ik gebruik JBoss 4.4.2GA icm EJB3 met annotations.
Dan de client:
Java:
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
| import javax.naming.InitialContext; import javax.naming.NamingException; public class Client { public static void main(String[] args) { InitialContext ic = null; try { ic = new InitialContext(); ic.addToEnvironment("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); ic.addToEnvironment("java.naming.provider.url", "jnp://127.0.0.1:1099"); } catch (NamingException e) { System.out.println("Exceptie opgetreden: " + e.getMessage()); } LibraryManagerSession lms = null; try { lms = (LibraryManagerSession) ic.lookup("LibraryManagerSessionBean"); for(int i=0; i<100; i++) { lms.newBook("book" + i); lms.removeBook("book" + i); } } catch (NamingException e) { System.out.println("Exceptie opgetreden: " + e.getMessage()); } lms.clear(); } } |
EJB:
Java:
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
| import java.util.HashMap; import java.util.HashSet; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote(LibraryManagerSession.class) public class LibraryManagerSessionBean implements LibraryManagerSession{ private HashMap<String, String> books = new HashMap<String, String>(); public void newBook(String name) { System.out.println("LibraryManagerSessionBean.newBook(): aangeroepen"); if(!books.containsKey(name)) { books.put(name, null); System.out.println("LibraryManagerSessionBean.newBook(): nieuw book("+name+") toegevoegd (" +books+ ")"); } } public void removeBook(String title) { System.out.println("LibraryManagerSessionBean.removeBook(): aangeroepen"); if(books.containsKey(title)) { books.remove(title); System.out.println("LibraryManagerSessionBean.removeBook(): book verwijderd("+title+") (" +books+ ")"); } } public void clear() { books.clear(); System.out.println("aantal books over:" + books.size()); System.out.println("LibraryManagerSessionBean.clear(): books HashMap is geleegd"); } public LibraryManagerSessionBean() { } } |