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
}
}
}
這是一個被通知的方式還是這應該改進?
所有幫助熱烈讚賞。謝謝。
使用這種方式,您無法連接您的連接,因此如果隊列中會有很多條目,那麼性能將成爲生產中的問題。 spring-jms是一個不錯的選擇,請考慮試試 – Hossein
@Hossein。感謝您的游泳池建議。我現有的應用程序中沒有彈簧。投資一個單獨的線程是否是一個好主意?我只需要我的服務器來聽一個隊列。 –
聽一個隊列是一回事,將它的連接聯繫起來是另一回事。如果您的業務邏輯意味着隊列中收到的數據必須逐個處理,那麼您可以使用當前的解決方案。但是,如果您需要一次處理所有到達的消息,那麼您需要爲其創建池化機制。 – Hossein