【发布时间】: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。感谢泳池的建议。我现有的应用程序中没有弹簧。投资一个单独的线程是个好主意吗?我只需要我的服务器监听一个队列。
-
监听一个队列是一回事,池化它的连接是另一回事。如果您的业务逻辑暗示队列中接收到的数据必须一一处理,那么您可以使用当前的解决方案。但是如果你需要一次处理所有到达的消息,那么你需要有一个池化机制。