我们在生产环境中遇到了一个我们无法在任何环境中复制的奇怪问题。订单流程&产生此错误的管理应用程序在一天内处理数千个订单。 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