Question

Nous avons un écouteur Java qui lit les messages texte d'une file d'attente dans JBossMQ.Si nous devons redémarrer JBoss, l'écouteur ne se reconnectera pas et recommencera à lire les messages.Nous recevons simplement des messages dans le fichier journal de l'auditeur toutes les 2 minutes indiquant qu'il ne peut pas se connecter.Y a-t-il quelque chose que nous ne définissons pas dans notre code ou dans JBossMQ ?Je suis nouveau sur JMS donc toute aide sera grandement appréciée.Merci.

Était-ce utile?

La solution

Vous devez implémenter dans votre code client javax.jms.ExceptionListener.Vous aurez besoin d'une méthode appelée onException.Lorsque la connexion du client est perdue, vous devriez obtenir une exception JMSException et cette méthode sera appelée automatiquement.La seule chose à laquelle vous devez faire attention est que si vous vous déconnectez intentionnellement de JBossMQ, cela générera également une exception.

Certains codes pourraient ressembler à ceci :

    public void onException (JMSException jsme)
    {
        if (!closeRequested)
        {
            this.disconnect();
            this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
        }        
        else
        {
            //Client requested close so do not try to reconnect
        }
    }

Dans votre code "establishConnection", vous implémenterez alors un while(!initialized) construction qui contient un try/catch à l’intérieur.Jusqu'à ce que vous soyez sûr d'être connecté et abonné correctement, restez dans la boucle while récupérant tous les JMS/Naming/etc.des exceptions.

Nous utilisons cette méthode depuis des années avec JBossMQ et elle fonctionne très bien.Nous n'avons jamais eu de problème avec nos clients JMS qui ne se reconnectaient pas après avoir fait rebondir JBossMQ ou perdu notre connexion réseau.

Autres conseils

Je vous recommande fortement d'utiliser le Abstractions Spring pour JMS telles que MessageListenerContainer pour assurer à votre place la reconnexion, les transactions et la mutualisation.Il vous suffit de fournir un MessageListener et de configurer le MessageListenerContainer avec ConnectionFactory et le conteneur fait le reste.

Si vous êtes uniquement un auditeur et que vous faites Non d'autres appels JMS autres que la configuration de la connexion, alors la réponse "onException() handler" est correcte.

Si vous effectuez des appels JMS dans votre code, il ne suffit pas d'utiliser le rappel onException().Les problèmes sont relayés du fournisseur JMS vers l'application soit via une exception sur un appel de méthode JMS ou via le rappel onException().Pas les deux.

Ainsi, si vous appelez des méthodes JMS à partir de votre code, vous souhaiterez également invoquer cette logique de reconnexion si vous obtenez des exceptions sur ces appels.

Un conseil tiré d'une expérience personnelle. Mettre à niveau vers Messagerie JBoss. Je le vois en production depuis 4 mois sans problème.Il offre un basculement entièrement transparent, parmi de nombreuses autres fonctionnalités.

De plus, si vous optez pour Spring, soyez très prudent avec le Modèle Jms.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top