我正在使用Java EE和ActiveMQ。我想实现一个JMS队列,我可以在其中向我的队列发送消息,而Consumer + MessageListener应该读取此消息。
我的消费者代码如下:
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 :(得分:0)
我遇到过同样的问题。在取消部署时,您需要确保您的战争具有正常关闭过程的概念。
你可以通过拥有一个实现init的HTTP Servlet(在这里完成所有的初始化)和销毁(在这里清除你所做的所有事情)来实现这一点。当取消部署战争时,Destory()将被JVM调用。
我使用Spring来定义所有bean,ActiveMQ连接,消息使用者和生产者。我的init()从master xml文件加载Spring应用程序上下文,在本地缓存对它的引用,然后destory()在应用程序上下文中调用close()。