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 :

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
...
l'exception complète :
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@
pourtant quand je teste cet objet il dit que c'est bien une instance de Serializable.

Le code du Bean :
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();
    }
 
}
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
 
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;
    }  
 
}
Quand je retire le code du makeConnection(), ca marche très bien. Par contre dès que je met la ligne :
_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 !!