2015-07-28 178 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 
     } 
    } 
} 

這是一個建議的方式還是應該改進?

所有幫助熱烈讚賞。謝謝。

相關問題