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