Bonjour,
J'utilise Spring JMS pour me connecter à un Topic persistent (en utilisant un Client Id unique et une connectivité persistente), jusque là pas de problème.
J'ai positionné le mode d'acquittement en mode CLIENT afin de faire disparaître le message du topic lorsque mon traitement métier est terminé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <jms:listener-container acknowledge="client" connection-factory="connectionFactory" destination-type="durableTopic" client-id="prdevent"> <jms:listener destination="${jms.topic.operations}" ref="topicSubscriberOnOperation"/> </jms:listener-container> <!-- Subscribers --> <bean id="topicSubscriberOnOperation" class="com.test.jms.mdb.TopicOperationEventSubscriber"> <property name="threadPoolSize" value="10"></property> </bean>
Ma problématique est la suivante :
Lorsque je reçois un message depuis mon listener que voici :
Un acquittement n'est pas envoyé au serveur JMS et si j'arrête mon application et que je la relance, le message JMS est à nouveau consommé.
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 public class TopicOperationEventSubscriber implements MessageListener ... @Override public void onMessage(Message arg0) { try { if (arg0 != null && arg0 instanceof TextMessage) { // Declare a callable OperationServiceRouterCallable callable = new OperationServiceRouterCallable ((TextMessage)arg0); // Start it in a asynchronous way executorservice.submit(callable); } else { log.warn("Object received null or not instance of javax.jms.TextMessage : "+arg0==null?"null":arg0); } } catch (Exception e) { log.error(e); } }
Par contre, dès lors que je passe par mon Callable en mettant un point d'arrêt au tout début du Callable (cad que le Callable n'a strictement rien fait, il est juste au début de son point d'entrée call ()) et que j'arrête mon application ; mon message JMS n'est plus consommé par mon listener ; comme si le fait d'avoir utilisé le Message JMS par un autre thread avait envoyé un acknowledge () au serveur JMS.
Auriez-vous déjà rencontré ce genre de problème : acquittement en mode CLIENT_ACKNOWLEDGE et multithread qui fait en sorte que des messages ne puissent plus être récupérés au redémarrage d'un process ?
Merci
Partager