我们在生产环境中遇到了一个无法在任何环境中复制的奇怪问题。生成此错误的订单流程和管理应用程序平均每天处理数千个订单。4000 起订。订单 xml 使用各种 xslt 进行转换,以在订单生命周期过程的每个阶段更新订单数据。但是每天一次,当xml转换的输出出错时,订单服务和管理应用程序的底层API将为订单抛出OrderUpdateException。应用程序内置的订单影响管理使用户能够重试或重新提交最初失败的订单任务。该任务调用无状态会话 bean,该 bean 通过使用 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 个订单经常失败。
提前致谢。