java - 为什么在使用 JAXB 数据绑定(bind)部署任何服务时 JAX-WS 会卡住?

标签 java maven jaxb jax-ws java-metro-framework

我正在尝试创建一个 JAX-WS 服务,该服务使用从 Opentravel Alliance schemas 的非常大(900 多个类)集生成的对象的 JAXB 数据绑定(bind)。 。

只要我的 web 方法成功,我就能够在各种 servlet 容器(Jetty、Tomcat6/7 等)上成功部署包含 JAX-WS 服务的 war(使用正确的 web.xml 和 sun-jaxws.xml) 没有引用我的任何 JAXB 对象。例如,这有效:

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class OTAService {
    public String sayHello(final String name) {
        return "Hello " + name + "!";
    }
}

但是,如果我通过添加 @XmlSeeAlso 注释或直接引用对象来更改 Web 方法以使用 JAXB 数据绑定(bind),则我尝试过的所有 servlet 容器都会无限期挂起(1 个多小时) ,没有错误,并且永远不会启动:

@WebService(serviceName = "OTAService", 
targetNamespace = "http://www.opentravel.org/OTA/2003/05")
@Addressing
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({OTAHotelResNotifRQ.class, OTAHotelResNotifRS.class})
public class OTAService {
    @Action(input = "OTA_HotelResNotif")
    @WebMethod(operationName = "OTA_HotelResNotif", action = "OTA_HotelResNotif")
    public @WebResult OTAHotelResNotifRQ tokenizeOtaHotelResNotifRq(
    @WebParam(partName = "OTA_HotelResNotifRQ", name = "OTA_HotelResNotifRQ", 
    targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
    final OTAHotelResNotifRQ request) {
        return request;
    }
}

我已经验证了所有必要的 jar 文件,包括 JAXB 和 JAX-WS API 以及运行时 jar 文件,都存在于 war 的/lib 目录中。

包含我的 JAXB 对象的 jar(这是我的 JAX-WS 项目所需的依赖项)可以通过在 this project 上运行 mvn clean install 来创建并安装到本地存储库。 。

我的 JAX-WS 项目,可用 here ,可以通过调用 mvn clean package jetty:run-war 在 Jetty 中运行。

您会注意到,如果仅存在简单的 sayHello 方法,Jetty 就会立即启动。但是,如果取消注释 JAXB 方法,Jetty 和我尝试过的所有其他 servlet 容器将在尝试实例化 JAX-WS servlet 时永远挂起。 有人可以解释为什么使用 JAXB 数据绑定(bind)的 Web 方法会阻止我的 war 部署吗?由于各种 servlet 容器上的卡住行为都是相同的,我觉得我一定遗漏了一些关键步骤;但是,由于没有报告错误并且容器启动只是挂起,所以我不知道如何继续。

最佳答案

这似乎是由于我的 opentravel 项目中存在大量 JAXB 对象所致。当我将 VisualVM 连接到启动器进程并对内存进行采样时,看起来好像 JAXB 出于某种原因正在遍历并预加载/缓存整个对象树(也许是为了重建架构以包含在 WSDL 中?)。

设置-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=truethis question的答案中所述并用 -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m 增加内存让 Jetty 快速启动。

我还不确定运行时性能的影响是否是可以接受的权衡。

关于java - 为什么在使用 JAXB 数据绑定(bind)部署任何服务时 JAX-WS 会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13184238/

相关文章:

java - 使用 JAXB 检索嵌套的 XML 元素值

java - 需要从 PHP 翻译成 Java

java - 预测乘法的位数

java - 在 tomcat 中运行 Maven Web 应用程序时出现 classnotfoundException

maven - 为什么 mvn 释放 :perform always create a new snapshot version and upload that to the repository instead of the non-snapshot release version?

java - 在 Java 中生成 JAXB 类时添加 toString、hashCode、equals

java - 从 xsd 为特定 xml 创建 JAVA 对象时获取 UnmarshalException

java - 如何在碰撞时仅删除数组中的一个 Body? Libgdx

java - DHIS-2 未运行

java - 在 Maven 中配置 JUnit 目录结构