2011-03-25 46 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