New*_*ian 22 java cxf jaxb out-of-memory webservice-client
我必须与一组Web服务进行交互,每个Web服务都有自己的WSDL和XSD.XSD有时合并在一个文件中,有时会分布在多个文件中(20-30).但是,根据经验,我知道大多数消息结构和数据共享一个大的公共子集,在不同的事务中可能只有20%不同.
不幸的是,我无法控制服务器部件或服务声明,所以让他们修复它是不可能的.客户端的第一个版本单独生成每个服务,然后将它们用作单独的外观,以形成连贯的更高级别服务,作为另一个系统的适配器.
我使用CXF和默认的JAXB绑定,并为每个服务强加了不同的生成包.我这样做是因为一些大多数服务都使用通用数据模型,但并非所有服务都使用相同的版本或定制,所以我有冲突,因此选择了暴力,所以我可以完成系统.
但是,这会导致适配器的内存要求在每个服务加载其上下文时通过屋顶.现在,即使在我开始发送请求和处理响应之前,我还有500M的内存仅用于容纳服务客户端的适配器.虽然我可以使用当前情况毫无问题地运行系统,但这会产生危害解决方案部署的约束; 我的客户希望大幅减少这种情况(60%或更多),以便该系统可以与其他系统一起安装而无需硬件升级.
问题如下: 是否有工具或技术允许我将每个交易的公共部分放在一起,以便它们可以生成一次并在需要时引用?
除了将系统重新分解为不同的框架或数据绑定所需的时间之外,我不受CXF或JAXB的约束.
预先感谢您的帮助.
---编辑---
谢谢Blaise.这指向JAXB的一个有用的功能:剧集.不幸的是,我仍然需要提取不同服务的公共基础部分.所以现在我需要的是一种通过结构差异提取这个公共部分的方法,这是一个diff工具,可以了解XSD描述的结构和类型层次结构,以便使用适当的引用来连接公共部分.专业部分.
小智 1
如果您想稍微精简一下,替代的编组技术(在任何框架中)可能会成功 - 放弃 JAXB 并尝试 JiBX,它已添加到最新的 CXF 版本中,或者可能只是 StAX。
由于您希望做一些比传统 JAX-Ws/JAXB 样式服务更自定义的事情,因此您可能需要考虑 Spring-WS。
Spring-WS 使您能够控制 Web 服务堆栈的各个方面。它可以以不同的方式路由消息(有效负载、XPath 表达式等),并且您可以使用任何您想要的编组/序列化技术(Jibx、jDOM、SAX 等)
这是一个说明选项的表格: http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#d4e1062
如果您确实想要变得更奇特,您可以采用较低级别的 API 之一,开始编组消息,一旦您的公共区域之一达到临界质量,就可以立即启动 JAXB 编组。
将消息路由到不同“端点”(在 Spring-WS 中)术语的能力意味着您还可以在这个接口(看起来像 DOM/SAX/等)上执行诸如“接受任何消息”之类的操作,然后进行一次大的编组那里的操作。
Spring-WS 在这里为您带来的关键是打破 JAX-WS 模式,预先玩一点游戏,然后您可以随时编组回 JAXB,无论是在拦截器中、您的应用程序中,等等. 理论上,您可以使用 JAXB DOM Source 进行相同的操作,但我认为 Spring-WS 堆栈为您提供了针对像这里这样的特殊情况的最细粒度的控制。