Nous avons un conteneur d'écoute de messages Spring JMS pour recevoir des messages de manière asynchrone. Utilisation de DefaultMessageListenerContainer et en mode sessionTransacted. Je comprends qu'être en sessionLe mode Transféré signifie qu'en cas d'exception, le message sera remis dans la file d'attente. Mais comment puis-je m'assurer que le message ne sera pas effacé de la file d'attente même si le récepteur (qui a choisi le message) se bloque ou que la machine qui l'utilise perd de la puissance?Conservation des messages dans la file d'attente en cas de panne du récepteur
Au début, je pensais que le mode d'accusé de réception CLIENT_ACKNOWLEDGE devrait me sauver, mais apparently ce n'est pas le cas, Spring appelle .acknowledge() quoi qu'il arrive.
Alors, voici ma question, comment puis-je garantir la livraison? En utilisant un MessageListenerContainer personnalisé? Utiliser un gestionnaire de transactions?
-1 parce que la conclusion tirée de ce document est incorrecte. Oui, il y a redelivery si l'appel receive() ou onMessage() échoue mais cela ne signifie pas que le destinataire a eu une chance de faire quelque chose avec le message. Si le récepteur se bloque à ce moment, le message est irrémédiablement perdu, ce que OP essayait d'éviter.Toutefois, l'utilisation d'une session traitée et d'appels de validation explicites, comme décrit dans l'autre réponse, empêche une telle perte de messages si le récepteur tombe en panne. –
Donc, en bref, l'article est trompeur? Quelle est la signification de l'accident? Si la méthode onMessage ne retourne pas en raison d'une panne, le message ne sera-t-il pas renvoyé? – soody
Je ne dis pas que l'article est trompeur, mais qu'il ne s'applique pas à la question originale. Tous les échecs mentionnés dans la citation d'article se produisent avant que le message ne soit renvoyé à l'application. OP voulait retarder l'accusé de réception de message jusqu'à ce que le message ait été renvoyé et que l'application l'ait traité, comme CLIENT_ACKNOWLEDGE est censé fournir. La définition de Session.AUTO_ACKNOWLEDGE applique réellement le comportement que OP essayait d'empêcher. –