我們在生產環境中遇到了一個我們無法在任何環境中複製的奇怪問題。訂單流程&產生此錯誤的管理應用程序在一天內處理數千個訂單。 4000個訂單。在訂單生命週期過程的每個階段中,使用各種xslt轉換訂單xmls以更新訂單數據。 不過一天一次,就會有當XML轉換器的輸出都被打亂是通過訂購服務&管理應用程序的底層API的訂單拋出的OrderUpdateException。訂單落實管理內置於應用程序中,使用戶可以重試或重新提交首先失敗的訂單任務。該任務調用無狀態會話bean,通過使用xalan應用xml命令的轉換來修改順序數據。在提交任務之前,用戶不必修改訂單數據,重試就會成功。使用xalan進行xml轉換會返回不一致的結果
我們知道爲什麼會失敗擺在首位,但不知道究竟是什麼觸發,導致錯誤的轉型的原因。
訂單XML:
<GetOrder.Response xmlns="urn:com:metasolv:oms:xmlapi:1">
<OrderID>243193</OrderID>
<_root>
....
<Wireless>
...
....
<MDN>
<Action>NONE</Action>
....
...
<Services>
<Voice>
<ServiceName>VOICE</ServiceName>
<ServiceStatus>Initial</ServiceStatus>
<FulfillmentItems>
<FulfillmentItem index="1353944898394">
<FulfillmentItemCode>DCF1</FulfillmentItemCode>
<FulfillmentMessages/>
<Attributes/>
</FulfillmentItem>
<FulfillmentItem index="1353944898409">
<FulfillmentItemCode>HCFB</FulfillmentItemCode>
<FulfillmentItemCodeDescription>FC-VOICE</FulfillmentItemCodeDescription>
<FulfillmentMessages/>
<Attributes/>
</FulfillmentItem>
</FulfillmentItems>
</Voice>
</Services>
</MDN>
</Wireless>
</_root>
</GetOrder.Response>
XSL:
<xsl:template match="oms:Wireless">
<OrderDataUpdate xmlns="http://www.metasolv.com/OMS/OrderDataUpdate">
<xsl:apply-templates select="oms:MDN"/>
</OrderDataUpdate>
</xsl:template>
<xsl:template match="oms:MDN">
<xsl:call-template name="voice_template">
<xsl:with-param name="mdnId" select="$mdnId"/>
<xsl:with-param name="oldmdnId" select="$oldmdnId"/>
...
</xsl:call-template>
</xsl:call-template>
<xsl:template name="voice_template">
<xsl:param name="mdnId"/>
<xsl:param name="oldmdnId"/>
<xsl:param name="minId"/>
....
.....
<xsl:for-each select="oms:Services/oms:Voice/oms:FulfillmentItems/oms:FulfillmentItem">
<xsl:variable name="fulfillmentItem_index">
<xsl:value-of select="@index"/>
</xsl:variable>
<Add path="/Wireless/MDN/Services/Voice/FulfillmentItems/FulfillmentItem[@index='{$fulfillmentItem_index}']/Attributes">
----
----
</Add>
<xsl:for-each>
<xsl:template>
<xsl:template match="* | @* | text()">
<!-- do nothing -->
<xsl:apply-templates/>
</xsl:template>
變換的輸出XML:
<?xml version="1.0" encoding="UTF-8"?>
<OrderDataUpdate xmlns="http://www.metasolv.com/OMS/OrderDataUpdate" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Add xmlns="" path="1353944898394']/Attributes">
<Attribute>
<name>HLR-MSISDN</name>
<value>2045731730</value>
</Attribute>
<Attribute>
<name>HLR-IMSI</name>
<value>302660397124421</value>
</Attribute>
<Attribute>
<name>HLR-NON_MTS_IMSI</name>
<value>302370397124421</value>
</Attribute>
</Add>
<Add xmlns="" path="/Wireless/MDN/Services/Voice/FulfillmentItems/FulfillmentItem[@index='1353944898409']/Attributes">
<Attribute>
<name>HLR-MSISDN</name>
<value>2045731730</value>
</Attribute>
....
<OrderDataUpdate>
我們發現for循環的第一次迭代過程中錯誤的值是越來越設置變量「fulfillmentItem_index」。對於連續迭代,正在設置正確的值。 因此,應用程序拋出OrderUpdateException並停止處理特定順序。然而,在重新提交相同的任務時,訂單流程會恢復,就好像沒有任何事情發生在第一位。
該應用程序在Weblogic Application Server 9.2 MP3上運行。我們也跑了環境檢查,這是它扔了:
。我跑了環境檢查,這是它扔了。
<checkEnvironmentExtension>
<EnvironmentCheck version="$Revision: 1.29 $">
<environment>
<item key="version.DOM.draftlevel">2.0fd</item>
<item key="java.class.path">:/home/weblogic/bea/patch_weblogic923/profiles/default/sys_manifest_classpath/weblogic_patch.jar:/opt/java1.5/lib/tools.jar:/home/weblogic/bea/weblogic92/server/lib/Bug8841241_920mp1.jar:/home/weblogic/bea/weblogic92/server/lib/weblogic_sp.jar:/home/weblogic/bea/weblogic92/server/lib/weblogic.jar:/home/weblogic/bea/weblogic92/server/lib/webservices.jar::/home/weblogic/bea/weblogic92/common/eval/pointbase/lib/pbclient51.jar:/home/weblogic/bea/weblogic92/server/lib/xqrl.jar:/home/weblogic/AQJMSHOME/AQJMS/StartupClass/lib/WLS9.0/AQJMSStartupClass.jar:/home/weblogic/AQJMSHOME/jar_files/aqapi13.jar:</item>
<item key="version.JAXP">1.1 or higher</item>
<item key="java.ext.dirs">/opt/java1.5/jre/lib/ext</item>
<item key="version.xerces2">Xerces-J 2.8.1</item>
<item key="version.xerces1">Xerces 1.4.4</item>
<item key="version.xalan2_2">Xalan Java 2.7.0</item>
<item key="version.xalan1">not-present</item>
<item key="version.ant">Apache Ant version 1.6.2 compiled on August 5 2004</item>
<item key="java.version">1.5.0.17</item>
<item key="version.DOM">2.0</item>
<item key="version.crimson">not-present</item>
<item key="sun.boot.class.path">/opt/java1.5/jre/lib/rt.jar:/opt/java1.5/jre/lib/i18n.jar:/opt/java1.5/jre/lib/sunrsasign.jar:/opt/java1.5/jre/lib/jsse.jar:/opt/java1.5/jre/lib/jce.jar:/opt/java1.5/jre/lib/charsets.jar:/opt/java1.5/jre/classes</item>
<item key="version.SAX">2.0</item>
<item key="version.xalan2x">Xalan Java 2.7.0</item>
</environment>
<status result="OK"/>
</EnvironmentCheck>
</checkEnvironmentExtension>
欣賞是否有人能幫我解釋這種奇怪的行爲。我們每天都會看到這種情況,至少有1或2份訂單會定期失敗。
在此先感謝。
嘗試用 xsl:variable>' =「@ index」>' –
2013-02-23 05:59:22
你說你跟蹤這個問題到'fulfillmentItem_index'變量。這是否意味着你有一個壞XML的例子?它是什麼樣子的?當你說「錯誤的價值正在被設定」時,你的意思是什麼?它以何種方式錯誤? – JLRishe 2013-02-23 06:30:30
我想我會對@Dimitre給出的建議給予一個旋轉。訂購xml以及應用xslt轉換沒有任何問題。我已經向甲骨文提出了一項服務請求,而甲骨文有時會收回該產品,但沒有什麼好的結果。這個問題仍未解決。不幸的是,自從核心API爲我們完成這個轉換之後,我們無法控制執行此轉換的java代碼。我們只開發xsls併爲工作流定義訂單任務(手動,自動化等)和流程。我們將xsls映射到每個工作流程任務。 – Avinash 2013-02-23 16:29:13