我正在尝试创建一个 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=true
如this question的答案中所述并用 -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
增加内存让 Jetty 快速启动。
我还不确定运行时性能的影响是否是可以接受的权衡。
关于java - 为什么在使用 JAXB 数据绑定(bind)部署任何服务时 JAX-WS 会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13184238/