2015-07-28 181 views
0

我很高兴地改进我的web应用程序,它运行在Apache Tomcat上。一个ActiveMQ添加了JMS服务器来发送和接收消息。如何实现ServletContextListener来侦听消息队列? (Tomcat,ActiveMQ)

我已经添加了一个ServletContextListener来连续收听我的消息。 但是,我不确定这是否是良好的生产代码。任何建议是值得欢迎的。

的web.xml

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

的Listeren:

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 
     } 
    } 
} 

这是一个被通知的方式还是这应该改进?

所有帮助热烈赞赏。谢谢。

+1

使用这种方式,您无法连接您的连接,因此如果队列中会有很多条目,那么性能将成为生产中的问题。 spring-jms是一个不错的选择,请考虑试试 – Hossein

+0

@Hossein。感谢您的游泳池建议。我现有的应用程序中没有弹簧。投资一个单独的线程是否是一个好主意?我只需要我的服务器来听一个队列。 –

+1

听一个队列是一回事,将它的连接联系起来是另一回事。如果您的业务逻辑意味着队列中收到的数据必须逐个处理,那么您可以使用当前的解决方案。但是,如果您需要一次处理所有到达的消息,那么您需要为其创建池化机制。 – Hossein

回答

0

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

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

的web.xml

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

的Listeren:

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 
     } 
    } 
} 

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

所有帮助热烈赞赏。谢谢。

相关问题