2013-10-08 1 views
0

Je travaille avec Java EE et ActiveMQ. Je veux réaliser une File d'attente JMS où je peux envoyer des messages à ma FILE D'ATTENTE et un Message + Message de Consumer + devrait lire ces messages.ActiveMQ, comment puis-je créer un seul consommateur?

Le code pour ma consommation ist ce qui suit:

private void initializeActiveMq() throws JMSException { 
      // Create a ConnectionFactory 
      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl); 
      // Create a Connection 
      connection = connectionFactory.createConnection(); 
      connection.start(); 
      // Create a Session 
      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 


      // Create the destination (Queue) 
      Queue queue = session.createQueue(queueName); 
      // Create a MessageConsumer from the Session to the Queue 
      consumer = session.createConsumer(queue); 

      consumer.setMessageListener(this); 

    } 

Mais le problème est, chaque fois que je vais exécuter ce code, il annonce une nouvelle consommation à ma file d'attente, puis-je avoir un comportement étrange des consommateurs n'a pas alors livré les messages correctement. Si je n'ai qu'un seul consommateur, cela fonctionne parfaitement. Comment puis-je m'assurer que je n'ai qu'un seul consommateur dans ma file d'attente?

+0

seulement appelez ce code une fois? – jtahlborn

+0

Le problème est, que je construis un fichier de guerre avec ce code. et chaque fois que je redéploie mon fichier ware sur mon serveur, ce code va appeler et il ajoute un nouveau consommateur. La seule solution à la monent est, chaque fois que je redéploie mon fichier de guerre, je dois redémarrer activemq, cela va tuer tous les consommateurs. Mais je veux une solution que je ne dois pas redémarrer activemq .. – user2115378

Répondre

0

J'ai rencontré exactement le même problème. Vous devez vous assurer que votre guerre a le concept d'une procédure d'arrêt gracieuse lorsqu'elle n'est pas déployée.

Vous pouvez y parvenir en ayant une Servlet HTTP qui implémente init (faites ici toute votre initialisation) et détruisez (faites tout ce que vous avez ici). Destory() sera appelé par la JVM quand la guerre n'est pas déployée. J'utilise Spring pour définir tous mes beans, connexions ActiveMQ, consommateurs de messages et producteurs. Mon init() charge le contexte de l'application Spring à partir d'un fichier maître xml, met en cache une référence localement, puis le destory() appelle close() sur le contexte de l'application.

Questions connexes