在weblogic服务器中运行Scales XML的pullXml

时间:2014-03-07 07:22:14

标签: scala xml-parsing

我使用了pullXml,因为文件大小非常大,> 100M,我写了一个示例程序如下:

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 callout(这是好的,因为Scala是JVM lang)供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和amp; loadXml方法位于同一个jar中,scale-xml_2.10-0.6.0-M1.jar。

只是想知道是否有人曾在weblogic服务器中使用过scale xml。听起来好像我必须放弃使用scale xml,如果weblogic服务器是执行环境。

由于

1 个答案:

答案 0 :(得分:0)

您的代码在weblogic之外运行会显示其javax.xml实现问题。它可能只需要你提供一个替代实现(例如aalto-xml)和“child first”或app first classloader设置。

如果你能告诉我(在这里回答很酷),如果对这些事情进行排序会很好,我会将其添加到文档中。

除了这个问题,我希望Scales能为你效劳:)

干杯, 克里斯