Comment désactiver temporairement un écouteur de message
Ce serait une belle et bonne façon de désactiver temporairement un message auditeur? Le problème que je veux résoudre est:
- JMS message est reçu par un auditeur de message
- J'obtiens une erreur lors de la tentative de traiter le message.
- - Je attendre de mon système pour obtenir de nouveau prête à être en mesure de traiter le message.
- Jusqu'à ce que mon système est prêt, je ne veux plus de messages, donc...
- ...Je veux désactiver le message de l'auditeur.
- Mon système est prêt pour le traitement à nouveau.
- Le message d'échec est traitée, et la JMS message est reconnu.
- Permettre à l'auditeur de message de nouveau.
Maintenant, je suis de l'utilisation de Sun Application Server. J'ai désactivé le message auditeur par la valeur null dans la MessageConsumer, et a permis à nouveau à l'aide de setMessageListener(myOldMessageListener), mais après cela, je ne reçois plus de messages.
source d'informationauteur davidi
Vous devez vous connecter pour publier un commentaire.
Diriez-vous si vous n'avez pas de retour de la onMessage() méthode d'écouteur jusqu'à ce que votre système est prêt à traiter à nouveau des messages? Que vais prévenir JMS de délivrer un autre message sur le consommateur.
C'est la async équivalent de ne pas convoquer les recevoir() dans un cas synchrone.
Il n'y a pas de multi-threading pour une session JMS, de sorte que le pipeline de messages est maintenu jusqu'à la onMessage() méthode retourne.
Je ne suis pas familier avec les implications de l'appelant dynamiquement setMessageListener(). La javadoc dit il y a un comportement indéfini si on l'appelle "lorsque les messages sont consommés par un auditeur ou de synchronisation des consommateurs". Si vous appelez à partir de l'intérieur de l'onMessage(), il semble que vous n'êtes frapper indéfini de cas.
Il y a démarrer/arrêter méthodes au niveau de la Connexion, si ce n'est pas trop grossiers pour vous.
Le problème est résolu par une solution de contournement en remplacement de l'auditeur de message par un receive() de la boucle, mais je suis toujours intéressé à la façon de désactiver un message d'auditeur et de lui permettre de peu de temps encore.
Qui ressemble pour moi comme les messages sont livrés, mais rien ne se passe avec eux parce que vous n'avez pas d'écouteur ci-joint. Il a été un moment depuis que j'ai fait n'importe quoi avec JMS, mais vous ne voulez pas d'avoir le message envoyé à la file d'attente de lettres mortes ou quelque chose si vous corrigez le système, puis de déplacer les messages d'un dossier sur l'origine de la file d'attente une fois que vous êtes prêt pour le traitement de nouveau?
Sur WebLogic vous pouvez configurer max retries, une erreur de la file d'attente pour gérer les messages qui dépassent le max tentative limite, et d'autres paramètres. Je ne suis pas certaine sur le dessus de ma tête, mais vous pourriez aussi être en mesure de spécifier une période d'attente. Tout cela est disponible pour vous dans la console d'administration. Je regarderais l'admin pour le fournisseur JMS vous avez, et de voir si elle peut faire quelque chose de similaire.
Dans JBoss le code suivant fera l'affaire:
Je pense que vous pouvez appeler
à l'intérieur de votre MessageListener mise en œuvre et de planifier le rétablissement de la tâche (par exemple dans ScheduledExecutorService). Cette tâche devrait appeler
et il aura à travailler. start() et stop() sont les méthodes utilisées pour redémarrer la livraison structrues (pas de connexion TCP).
Lire la Javadoc https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#stop--
De cesse temporairement d'une connexion de livraison de messages entrants, vous devez utiliser
stop()
méthode deConnection
interface: https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#stop--Il suffit de ne pas appeler
connection.stop()
deMessageListener
parce que, selon JMS spec. vous obtiendrez de blocage ou d'exception. Au lieu de cela, vous pouvez appelerconnection.stop()
de thread différent, il vous suffit de synchroniserMessageListener
et le fil qui va suspendre la connexion avec la fonctionconnection.stop()