Bonjour à tous,
je souhaite utiliser un EJB qui tous les x temps enverra un message à ceux qui l'écoutent (du style d'un capteur relevant une valeur) via JMS. A défaut de pouvoir créer un thread dans cet EJB, j'utilise un Timer qui va donc invoquer une méthode sur cet EJB.
Néanmoins lors de la création du timer, j'ai une exception, visiblement dû au fait que la connexion vers le TopicFactory n'est pas sérialisable :
l'exception complète :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 GRAVE: EJB5117:Timer creation failed for container [84609193084059649] primary key [null] and info [beans.NewSessionBean@1fa99f7] GRAVE: javax.ejb.CreateException ...... Caused by: java.io.NotSerializableException: com.sun.messaging.jms.ra.DirectConnection ...
pourtant quand je teste cet objet il dit que c'est bien une instance de Serializable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 GRAVE: EJB5117:Timer creation failed for container [84609193084059649] primary key [null] and info [beans.NewSessionBean@
Le code du Bean :
et du timer :
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
67
68
69
70
71
72
73
74
75
76
77
78 package beans; import java.io.Serializable; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Stateful; import javax.jms.JMSException; import javax.jms.Session; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.naming.Context; @Stateful public class NewSessionBean implements NewSessionBeanRemote { @Resource(mappedName="topicF") private TopicConnectionFactory _factory; @Resource(mappedName="topicDestination") private Topic _topic; Context _context; private TopicSession _session; private TopicConnection _connection; private TopicPublisher _publisher; @EJB TimerSessionBean _timer; public void fire() { System.out.println("FIREEEE"); } public void start(){ System.out.println("Activate"); System.out.println(this instanceof Serializable); System.out.println(TopicConnection.class instanceof Serializable); _timer.init(this); } @PostConstruct public void makeConnection(){ try { _connection = _factory.createTopicConnection(); System.out.println(_connection.toString()); System.out.println(_connection.getClass() instanceof Serializable); _session = _connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); _publisher = _session.createPublisher(_topic); _connection.start(); System.out.println("connection made"); } catch (JMSException ex) { Logger.getLogger(NewSessionBean.class.getName()).log(Level.SEVERE, null, ex); } } @PreDestroy public void endConnection(){ try { System.out.println("end connection "); _session.close(); _connection.close(); } catch (JMSException ex) { Logger.getLogger(NewSessionBean.class.getName()).log(Level.SEVERE, null, ex); } } public void stop() { _timer.stop(); endConnection(); } }
Quand je retire le code du makeConnection(), ca marche très bien. Par contre dès que je met la ligne :
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 beans; import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.ejb.PostActivate; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.TimedObject; import javax.ejb.Timer; @Stateless public class TimerSessionBean implements TimedObject { private Timer _timer; @Resource private SessionContext _sessionCtx; @PostActivate public void init(NewSessionBean info){ System.out.println(info.toString()); _timer = _sessionCtx.getTimerService().createTimer(7000L, 7000L,info); } @Override public void ejbTimeout(Timer timer) { System.out.println("Timer is out"); ((NewSessionBean)timer.getInfo()).fire(); } @PreDestroy public void stop() { System.out.println("Timer is destroy"); if(_timer!=null){ _timer.cancel(); System.out.println("Timer cancelled"); } _timer = null; } }
_connection = _factory.createTopicConnection();
j'ai le problème ..
Serais ce un réglage particulier à faire sur les ressources du serveur (j'utilise Glassfish v3) ??
Si vous avez des idées ?
Merci d'avance !!







Répondre avec citation
Partager