2013-10-08 65 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()。