2011-03-25 48 views
22

我必须与一组Web服务交互,每个服务都有自己的WSDL和XSD。 XSD有时会合并成一个文件,有时会沿着多个文件传播(20-30)。然而,根据经验,我知道大多数消息结构和数据共享一个很大的公共子集,在不同的事务中可能只有20%不同。如何合并来自不同服务的WSDL和XSD的公共部分?

不幸的是,我无法控制服务器部件或服务的声明,所以让他们修复它是不可能的。客户端的第一个版本分别生成了每个服务,然后将它们作为单独的外观用作另一个系统的适配器,形成一个连贯的高级服务。

我用默认的JAXB绑定使用CXF并为每个服务强加了不同的生成包。我这样做是因为一些大多数服务使用通用的数据模型,但并不是所有的都使用相同的版本或定制,所以我有冲突,因此选择了暴力行为,以便我可以完成系统。

但是,这会导致适配器的内存要求通过屋顶,因为每个服务加载其上下文。现在,我已经向上提供了500M的内存,仅用于安装服务客户端的适配器,甚至在我开始发送请求和处理响应之前。尽管我可以使用当前的情况运行系统而没有任何问题,但这会造成妨碍解决方案部署的限制;我的客户希望大幅度降低这个比例(60%或更多),以便这个系统可以和其他人一起安装而不需要硬件升级。

问题如下: 是否有一种工具或技术可以让我将每个事务的公共部分放在一起,以便它们可以一次生成并在需要时引用?

除了将系统重新分配到不同的框架或数据绑定所需的时间之外,我没有与CXF或JAXB绑定。

非常感谢您的帮助。

---编辑---

谢谢布莱斯。这指向JAXB的一个有用功能:剧集。不幸的是,我仍然需要提取不同服务的通用基础部分。所以现在我需要的是通过结构差异来提取这些公共部分的方法,这是一种diff工具,它可以了解XSD描述的结构和类型层次结构,以便将适当的引用连接到公共部分专业部分。

+2

您可能有兴趣在EclipseLink JAXB(MOXy)中关注以下相关功能:https://bugs.eclipse.org/340997 – 2011-03-25 20:21:22

+1

他们是否使用共享名称空间作为共享部分?如果不是,你就是SOL,因为各个部分根本不明白它们是相同的。 – 2011-06-01 15:02:01

+0

1Gb的内存成本是多少?你的时间多少钱?将此指出给客户。 – artbristol 2011-06-03 09:41:46

回答

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 marshall。

将消息路由到不同'端点'(使用Spring-WS)术语的能力意味着你也可以在这个接口(看起来像DOM/SAX/etc)上做“接受任何消息”之类的东西,然后在那里有一个大的编组操作。 Spring-WS将在这里购买你的关键是打破JAX-WS模式,尽情地玩一些前期游戏,然后你总是可以再回到JAXB,不管它是在拦截器,你的应用等等。在理论上你可以和JAXB DOM Source一样,但是我认为Spring-WS堆栈为你提供了对于特殊情况的最好控制。

+0

我试过用JiBX,XMLBeans和SDO作为JAXB的替代绑定。一些提供了一些收益,但他们都仍然太高,不切实际。从我的测试中我所能得到的最好的结果是内存增加了大约20%,不算太破旧,但我确实瞄准了80%+ ... – Newtopian 2011-06-20 13:48:08

+0

然而Spring-WS提供了更多,所以我最终使用Spring-WS作为一个基于你陈述的原因的框架。到目前为止,我们评估的唯一可行的解​​决方案是完全放弃XSD并通过XML Transformation生成XML。最佳答案呢! – Newtopian 2011-06-20 14:34:12

-1

最好的诀窍是提供一个静态wsdl。只需打开wsdl,保存它,上传到服务器,并指示客户端指向静态而不是动态自己生成的。

+0

hmmm ...我遇到的问题是WSDL的* code * generation *,而不是其他方法。实际上,我拥有的WSDL是由管理服务器端的人员提供的。哈,正如我所说,我没有访问服务器。也许我在这个问题上还不够清楚,但我相当肯定已经涵盖了所有这些。 – Newtopian 2011-06-16 19:11:09