从历史上看,我将我的 JMS 消费者应用程序部署为部署在 Tomcat(Windows 框)下的 Spring webapps。然后,这些消费者将在同一个 Tomcat 实例下与我的其他 Web 应用程序一起运行。然而,随着我使用的消费者数量的增加,我意识到这正在变成一场维护噩梦。
我的解决方案是将这些 webapps 转换为部署为 jar 的“主要方法”独立应用程序。事实上,我能够成功地将它们打包在一起,以尝试尽可能多地重用资源(DAO、依赖项等)。
这是我的主要方法的样子:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
try {
FooListener fooListener = (FooListener) context.getBean("fooListener");
fooListener.start();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
try {
BarListener barListener = (BarListener) context.getBean("barListener");
barListener.start();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
我的问题:
- 我是否需要做任何特别的事情来关闭我的主方法应用程序中的 JMS 连接,或者它们会在应用程序终止时正常关闭?
- 是否有人对是否使用 tomcat 或作为独立应用程序部署 jms 消费者有任何个人偏好或其他方面?
编辑:
更多信息:FooListener 和 BarListener 扩展了以下抽象类。它们从 applicationContext.xml 文件中的相应 bean 继承它们的值,并且它们都覆盖 onMessage() 方法以异步使用消息。
public abstract class TextMessageListener implements MessageListener {
protected ConnectionFactory connectionFactory;
protected String queueName;
protected String selectors;
public void start() throws JMSException {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(session.createQueue(queueName), selectors);
consumer.setMessageListener(this);
connection.start();
}
public abstract void onMessage(Message message);
}