2

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

只要我的 web 方法不引用,我就能够在各种 servlet 容器(Jetty、Tomcat6/7 等)上成功部署包含我的 JAX-WS 服务的战争(使用正确的 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 + "!";
    }
}

但是,如果我通过添加注释或直接引用对象来更改 web 方法以使用 JAXB 数据绑定,@XmlSeeAlso我尝试过的所有 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 项目所需的依赖项,可以通过mvn clean install此项目上运行来创建并安装到本地存储库。

我的 JAX-WS 项目(可在此处获得)可以通过调用mvn clean package jetty:run-war.

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

4

1 回答 1

3

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

按照这个问题-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true的答案中的描述进行设置,并通过让 Jetty 快速启动来增加 内存。-Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

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

于 2012-11-01T20:34:59.643 回答