【问题标题】:How to implement ServletContextListener to listen to a message queue? (Tomcat, ActiveMQ)如何实现 ServletContextListener 来监听消息队列? (Tomcat,ActiveMQ)
【发布时间】:2015-10-18 17:14:21
【问题描述】:

我很高兴改进我在 Apache Tomcat 上运行的 Web 应用程序。添加了一个ActiveMQ JMS 服务器来发送和接收消息。

我添加了一个 ServletContextListener 来持续收听我的消息。 但是,我不确定这是否适合生产环境。欢迎任何建议。

web.xml

<listener>
    <listener-class>com.test.JMSContextListener</listener-class>
</listener>

听众:

public class JMSContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        JMSConnector.startListening();
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        //Nothing
    }
}

连接:

public class JMSConnector {

    static Context context;
    static QueueConnectionFactory factory;

    static {
        try {
            context = new InitialContext();
            factory = (QueueConnectionFactory) context.lookup("java:comp/env/jms/ConnectionFactory");
        } catch (NamingException ex) {
            //TODO
        }
    }

    public static void startListening() {
        try {
            Connection connection = factory.createConnection();
            Queue queue = (javax.jms.Queue) context.lookup("java:comp/env/jms/Queue");
            Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

            MessageConsumer consumer = session.createConsumer(queue);

            //This MessageListener will do stuff with the message
            MessageListenerImpl messageListener = new MessageListenerImpl();
            consumer.setMessageListener(messageListener);
            connection.start();

            // Start connection or nothing will happen!!!
            connection.start();
        } catch (JMSException ex) {
            //TODO
        } catch (NamingException ex) {
            //TODO
        }
    }
}

这是一个建议的方式还是应该改进?

热烈感谢所有帮助。谢谢。

【问题讨论】:

  • 使用这种方式,您无法将连接池化,因此如果队列将有很多条目,则生产中的性能将成为问题。 spring-jms 是个不错的选择,考虑试试
  • @Hossein。感谢泳池的建议。我现有的应用程序中没有弹簧。投资一个单独的线程是个好主意吗?我只需要我的服务器监听一个队列。
  • 监听一个队列是一回事,池化它的连接是另一回事。如果您的业务逻辑暗示队列中接收到的数据必须一一处理,那么您可以使用当前的解决方案。但是如果你需要一次处理所有到达的消息,那么你需要有一个池化机制。

标签: java tomcat jms activemq


【解决方案1】:

我添加了一个带有线程的改进解决方案。

仍然欢迎额外的帮助 :-)

web.xml

<listener>
    <listener-class>com.test.JMSContextListener</listener-class>
</listener>

听众:

public class JMSContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        Thread thread = new Thread(new JMSConnector());
        thread.start();
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        //Nothing
    }
}

连接:

public class JMSConnector implements Runnable {
    public void run() {
        try {
            Context context = new InitialContext();
            QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("java:comp/env/jms/ConnectionFactory");            
            Connection connection = factory.createConnection();
            Queue queue = (javax.jms.Queue) context.lookup("java:comp/env/jms/serverQueue");
            Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

            MessageConsumer consumer = session.createConsumer(queue);

            //This MessageListener will do stuff with the message
            MessageListenerImpl messageListener = new MessageListenerImpl();
            consumer.setMessageListener(messageListener);
            connection.start();

            // Start connection or nothing will happen!!!
            connection.start();
        } catch (JMSException ex) {
            //TODO
        } catch (NamingException ex) {
            //TODO
        }
    }
}

这是一个建议的方式还是应该改进?

热烈感谢所有帮助。谢谢。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多