我们在ear文件中部署了一些war文件。一些war文件有一个类,它以单例形式缓存来自PLM系统的静态数据。由于某些类需要几分钟才能加载,因此我们使用web.xml中的load-on-startup来提前加载它们。这一切都正常,直到我们尝试在生产服务器上重新部署应用程序。 (WebLogic 10.3)我们从PLM API中获得了有关已加载的dll的异常。我们的PLM供应商已确认这是一个问题,并表示他们不支持使用load-on-startup。这对我们的开发盒来说也是一个巨大的问题,我们一直在重新部署应用程序。我们大多数人,当我们不使用其中一个使用缓存的应用程序时,会将它们注释掉。显然,我们不能为生产服务器做到这一点。现在我们将耳朵转移到生产服务器,将其部署在控制台中,等待它崩溃,关闭应用服务器实例,然后重新启动它。
我们需要找到解决这个问题的方法......
一个建议是创建一个servlet,我们可以在服务器启动后调用它来加载各种缓存。虽然这将工作,我正在寻找一些更清洁的东西。无论如何都要检测一旦服务器启动然后关闭方法?
感谢。
答案 0 :(得分:1)
如何使用servlet容器生命周期监听器,例如ServletContextListener?
编辑:对不起,在重新阅读你的问题后,我认为这不会起作用。您希望每个服务器生命周期只加载一次,而不是应用程序生命周期。每次部署应用程序时都会调用ServletContextListener的方法,就像一个load-on-startup servlet(它似乎正在使用它)。我的建议将以不同的方式做同样的事情。我会尝试Chris Nava的建议。
EDIT2:看起来tomcat还有一些lifecycle listener(s)可用。看起来文档很稀疏,但这可能会让您在服务器启动时只执行一次。
EDIT3:是的,tomcat生命周期监听器是要走的路。 This link很好地解释了如何设置一个。应该相当直接。如果忽略有关将事务添加到tomcat的部分,那么它将彻底解决如何添加生命周期监听器的问题。
答案 1 :(得分:1)
我们遇到了加载本机DLL的第三方JDBC驱动程序的类似问题。重新部署应用程序时,驱动程序会崩溃,说DLL已经加载。解决方案(如果可以称之为)是将驱动程序从deploy移动到lib。这样,驱动程序对应用程序服务器来说是全局的,并且在重新部署应用程序时无需重新加载。