2014-03-07 25 views
0

我用pullXml由於文件的大小是相當大的,> 100M,我寫了一個示例程序如下:運行秤XML的pullXml在WebLogic服務器

object TestXml { 
    val mc = new java.math.MathContext(1024) 
    val zero = BigDecimal(0, mc) 

    def calculate(infile: String, encoding: String): BigDecimal = { 
     val inStream = new FileInputStream(infile) 
     val pull = pullXml(new InputSource(new InputStreamReader(inStream, encoding))) 
     val ns = Namespace("urn:abcaus.onair.sintecmedia.com") 
     val qnames = List(ns("ePGResp"), "EPGResponse"l, "Event"l) 
     def eventStream = iterate(qnames, pull).toStream 
     var count = zero 
     eventStream foreach { event => count += eventId(event) } 
     inStream.close 
     count 
    } 

    def eventId(event: XmlPath): Long = 
     text(event.\*("EventID")).toLong 

    def main(args: Array[String]): Unit = args.toList match { 
     case infile :: encoding :: Nil => println(calculate(infile, encoding)) 
     case _ => println("usage scala -cp classpath au.net.abc.epg.TestLoadXml infile encoding") 
    } 
} 

我在命令行中運行該程序如下:

$JAVA_HOME/bin/java -cp JarContainsSampleProgram.jar:scala-library-2.10.2.jar:scala-reflect-2.10.2.jar:scalalogging-slf4j_2.10-1.0.1.jar:scalaz-core_2.10-7.0.0.jar:scalaz-effect_2.10-7.0.0.jar:scalaz-iterv_2.10-7.0.0.jar:scales-xml_2.10-0.6.0-M1.jar:slf4j-api-1.6.4.jar TestLoadXml /home/wonga4d/EPG/Huge.xml utf-16 

它運行成功返回一個值,也就是說,879452677392.

然而,當我部署它作爲Oracle服務總線的Java標註(這是確定的,因爲Scala是JVM郎)通過使用一個OSB代理,仍然使用相同的輸入文件和編碼,我得到了以下錯誤

Callout to java method "public static scala.math.BigDecimal au.net.abc.epg.TestLoadXml.calculate(java.lang.String,java.lang.String)" resulted in exception: Got an event (Text()) that should not be in the prolog java.lang.RuntimeException: Got an event (Text()) that should not be in the prolog 
at scala.sys.package$.error(package.scala:27) 
at scala.Predef$.error(Predef.scala:142) 
at scales.utils.package$.error(package.scala:19) 
at scales.xml.parser.pull.PullUtils$$anonfun$getMisc$1.apply(PullIterator.scala:144) 
at scales.xml.parser.pull.PullUtils$$anonfun$getMisc$1.apply(PullIterator.scala:141) 
at scala.util.Either.fold(Either.scala:97) 
at scales.xml.parser.pull.PullUtils$.getMisc(PullIterator.scala:141) 
at scales.xml.parser.pull.XmlPull$class.start(PullIterator.scala:89) 
at scales.xml.parser.pull.XmlPulls$$anon$1.start(XmlPull.scala:134) 
at scales.xml.parser.pull.XmlPulls$$anon$1.<init>(XmlPull.scala:156) 
at scales.xml.parser.pull.XmlPulls$class.pullXml(XmlPull.scala:134) 
at scales.xml.package$.pullXml(package.scala:7) 
at TestXml$.calculate(TestLoadXml.scala:23) 
at TestXml.calculate(TestLoadXml.scala) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at stages.transform.runtime.JavaCalloutRuntimeStep$1.run(JavaCalloutRuntimeStep.java:173) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363) 
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146) 
at weblogic.security.Security.runAs(Security.java:61) 
at stages.transform.runtime.JavaCalloutRuntimeStep.processMessage(JavaCalloutRuntimeStep.java:195) 
at com.bea.wli.sb.pipeline.debug.DebuggerRuntimeStep.processMessage(DebuggerRuntimeStep.java:74) 
at com.bea.wli.sb.stages.StageMetadataImpl$WrapperRuntimeStep.processMessage(StageMetadataImpl.java:346) 
at com.bea.wli.sb.pipeline.PipelineStage.processMessage(PipelineStage.java:84) 

它未能在pullXml。但是,當我在之前展示的命令行上運行時,它總是成功。如果我不使用pullXml,但使用loadXml,即使在weblogic服務器中運行,它也會始終成功。但是如果加載一個巨大的xml文件,loadXml會出現問題。 pullXml & loadXml方法位於同一個jar中,scales-xml_2.10-0.6.0-M1.jar。

只是想知道是否有人在weblogic服務器中使用scale xml。聽起來像我放棄了使用scale xml如果weblogic服務器是執行環境。

謝謝

回答

0

您的代碼在weblogic之外運行會顯示其javax.xml實現問題。它可能只需要你提供一個備用的實現(例如aalto-xml),其中「孩子優先」或應用第一類加載器設置。

如果你可以讓我知道(回答這裏很酷),如果這樣的事情會很好,我會把它添加到文檔。

外面這個問題,我希望秤正在爲你:)

乾杯, 克里斯

相關問題