有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么JAXWS在使用JAXB数据绑定部署任何服务时都会冻结?

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

我能够成功地在各种servlet容器(Jetty、Tomcat6/7等)上部署包含我的JAX-WS服务的war(使用正确的web.xml和sun jaxws.xml),只要我的web方法不引用我的任何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数据绑定,那么我尝试的所有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来创建并安装到本地repo

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

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


共 (1) 个答案

  1. # 1 楼答案

    这似乎是因为我的opentravel项目中有大量JAXB对象。当我将VisualVM连接到launcher进程并对内存进行采样时,JAXB似乎出于某种原因正在遍历和预加载/缓存整个对象树(可能是为了重建模式以包含在WSDL中?)

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

    我还不确定运行时性能的下降是否是一个可接受的权衡