2013-10-08 137 views
0

我正在使用Java EE和ActiveMQ。我想實現一個JMS隊列,我可以將消息發送到我的QUEUE,並且Consumer + MessageListener應該讀取此消息。ActiveMQ,我如何創建只有一個消費者?

的代碼爲我的消費者IST如下:

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); 

    } 

但問題是,每次我都會運行此代碼它的廣告新的消費我的排隊時間,然後我有一些奇怪的行爲的消費者然後沒有正確地傳遞消息。如果我只有一個消費者,它完美的作品。

那麼如何確保我的隊列中只有一位消費者?

+0

只調用這段代碼一次? – jtahlborn

+0

問題是,我用這段代碼構建了一個war文件。每次我在我的服務器上重新部署我的ware文件時,這段代碼都會調用它並添加一個新的使用者。這個解決方案的唯一解決方案是,每次我重新部署我的戰爭文件時,我都必須重新啓動activemq,這會殺死所有消費者。但我想要一個解決方案,我不能重新啓動activemq .. – user2115378

回答

0

我遇到了完全相同的問題。你需要確保你的戰爭在解除部署時有一個正常關機程序的概念。

你可以通過一個實現init的HTTP Servlet(在這裏執行所有的初始化)並銷燬(完成你在這裏清理的所有內容)來實現這一點。當戰爭未部署時,Destory()將被JVM調用。

我使用Spring來定義我所有的bean,ActiveMQ連接,消息使用者和生產者。我的init()從主xml文件加載Spring應用程序上下文,緩存對本地的引用,然後destory()在應用程序上下文中調用close()。