由于为ActorSystem [mpe] java.lang.StackOverflowError启用了“ akka.jvm-exit-on-fatal-error”启用,因此关闭了JVM

时间:2019-02-14 05:00:49

标签: akka akka-stream akka-http akka-cluster akka-persistence

我正在研究一个修补程序,该修补程序需要接受小于1,00,000阈值的SOAP XML请求。这样我们就可以在处理之前验证大型xml文档。

现在,当阈值小于1,00,000时,我对akka的错误报告感到困惑。我注意到如果一个父项下的元素大于2000,则会出现此错误。如果元素被多个父元素划分,则不会出现错误。请帮我找出下面来自akka的错误。

I have also to tried with disabling "akka.jvm-exit-on-fatal-error" in the configuration.

akka {

  jvm-exit-on-fatal-error = off

  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }

  remote {
    enabled-transports = ["akka.remote.netty.ssl"] 
    .
    .
    .
  }
} 

Soap Request Body的示例:

<soapenv:Body>
    <cai3:Create>
        <cai3:Attributes>
            <CreateAttributes attributeId="1">
                <attributeId>12345678</attributeId>
                <!--Zero or more repetitions:-->
                <node1 attributeId="12345678">
                    <node1>12345678</node1>
                    <node1/>
                </node1> 
                .......
                .......
                .......
                .......
                .......
                .......
                .......

                on so on upto 3000 same elements

                </CreateAttributes>
        </cai3:Attributes>
    </cai3:Create>
</soapenv:Body>

异常日志

Module 2019-02-13 17:07:20,669+0800 [t-dispatcher-16] ERROR [akka.actor.ActorSystemImpl] Uncaught error from thread [mpe-akka.remote.default-remote-dispatcher-6]: null, shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[mpe]
java.lang.StackOverflowError: null
        at java.lang.Exception.<init>(Exception.java:76) [na:1.8.0_172]
        at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89) [na:1.8.0_172]
        at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72) [na:1.8.0_172]
        at sun.reflect.GeneratedMethodAccessor46.invoke(Unknown Source) [na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [na:1.8.0_172]
        at java.lang.reflect.Method.invoke(Method.java:498) [na:1.8.0_172]
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [na:1.8.0_172]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [na:1.8.0_172]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [na:1.8.0_172]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [na:1.8.0_172]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [na:1.8.0_172]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [na:1.8.0_172]

1 个答案:

答案 0 :(得分:0)

看起来您在通过akka-http来使用SOAP消息方面似乎没有问题。

基于您发布的堆栈跟踪信息,问题出在导致java.lang.StackOverflowError的java序列化上,或者是因为您通过akka-remoteakka-cluster发送消息或坚持该消息与akka-persistence。这些是在akka中可以使用Java序列化的地方。除非您确实明确使用它。

您可以了解为什么JavaSerializationIsBroken并导致StackOverflowError错误的原因。

我建议您尝试使用消息,而不涉及akka-remoteakka-persistence。如果这样做确实有帮助,您就知道问题出在Java序列化。

下一步是将Java序列化替换为更现代的序列化协议,例如protocol-buffers