在开发 Java EE 应用程序时,我经常遇到在应用程序启动、停止等时执行操作的“问题”。例如,对于 Weblogic,有一种机制(应用程序生命周期侦听器)。但如果你想让你的应用程序免受应用程序的影响。服务器特定,您必须找到不同的解决方案。有些人建议使用启动时加载的 servlet,并“滥用”
init()
/destroy()
。
其他人说使用
ServletContextListener
。对我来说,最后一个听起来最好(根据 ServletContextListener
的 java 文档)。不幸的是,今天我尝试了 JBoss 7,其中似乎 jax-ws webservices 在任何其他 Servlet
之前初始化,因此在 之前初始化ServletContextListener
收到通知。
长话短说 - 我只是在这里面临一些应用程序服务器特定的问题 - 还是有任何“更合适”的标准化 Java EE 方法来注册事物,在初始化任何 Web 服务、Servlet 之前进行操作?
如果你的网络服务是这样注释的
@javax.jws.WebService(...)
public interface YourServiceEndpoint
它们还不是真正的 servlet,但 JBoss (Jax-WS) 会将它们变成一家初创公司。
我正在使用 jboss-4.2.3,并且在调用我的
ServletContextListner
之前我也会收到这些消息。
[org.jboss.wsf.framework.management.DefaultEndpointRegistry] register: jboss.ws:context=crm,endpoint=YourService
但我想知道,这个 Web 服务在完整的应用程序启动之前是否可用,因为几乎在部署结束时我收到以下消息
[org.jboss.wsf.stack.jbws.WSDLFilePublisher] WSDL published to: ... YourServlet(..).wsdl
所以我猜测,这是一个与 jboss 相关的问题。也许我们应该在另一个应用程序服务器上进行测试来证明这一点。
我在 WebLogic 14 上使用 Java EE 8 API 使用以下 bean 完成了此操作
@Singleton
@Startup
public class MyApplicationLifecycleListener {
@PostConstruct
public void init(){}
@PreDestroy
public void destroy(){}
}
我的运行时遇到了与 OP 相同的问题,我正在寻找将我的代码与特定于供应商的库分离的方法。
按照评论,并在 Maven 上找到的
javax:javaee-api
的帮助下,我取代了 WebLogic 的 ApplicationLifecycleListener
,从而消除了 POM 的依赖关系以及它带来的所有其他问题。
我希望这也适用于 JBoss。