处理 Java EE 应用程序生命周期的“标准化”方式

问题描述 投票:0回答:2

在开发 Java EE 应用程序时,我经常遇到在应用程序启动、停止等时执行操作的“问题”。例如,对于 Weblogic,有一种机制(应用程序生命周期侦听器)。但如果你想让你的应用程序免受应用程序的影响。服务器特定,您必须找到不同的解决方案。有些人建议使用启动时加载的 servlet,并“滥用”

init()
/
destroy()

其他人说使用

ServletContextListener
。对我来说,最后一个听起来最好(根据
ServletContextListener
的 java 文档)。不幸的是,今天我尝试了 JBoss 7,其中似乎 jax-ws webservices 在任何其他
Servlet
之前初始化,因此在
 之前初始化ServletContextListener
收到通知。

长话短说 - 我只是在这里面临一些应用程序服务器特定的问题 - 还是有任何“更合适”的标准化 Java EE 方法来注册事物,在初始化任何 Web 服务、Servlet 之前进行操作?

java web-services jakarta-ee jboss7.x
2个回答
1
投票

如果你的网络服务是这样注释的

@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 相关的问题。也许我们应该在另一个应用程序服务器上进行测试来证明这一点。


0
投票

我在 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。

© www.soinside.com 2019 - 2024. All rights reserved.