【问题标题】:How to trace the root cause of an Akka serialization failure?如何追踪 Akka 序列化失败的根本原因?
【发布时间】:2018-05-24 06:57:03
【问题描述】:

从 Akka 获取序列化错误,如下所示,您如何环绕 Akka 消息的有问题的不可序列化成员/字段?该异常确实命名了无法序列化的成员值(低于com.our.member.object),但该对象本身包含许多嵌套成员,并且错误消息似乎对无法序列化的有问题的嵌套对象几乎没有线索:

2018-05-24T06:30:51.897Z 错误 VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter - 无法使用序列化程序 [class akka.actor] 序列化远程消息 [class akka.actor.ActorSelectionMessage] remote.serialization.MessageContainerSerializer]。瞬态关联错误(关联仍然有效)akka.remote.MessageSerializer$SerializationException:无法使用序列化程序 [class akka.remote.serialization.MessageContainerSerializer] 序列化远程消息 [class akka.actor.ActorSelectionMessage]。在 akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:62) 在 akka.remote.EndpointWriter.$anonfun$serializeMessage$1(Endpoint.scala:895) 在 scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)在 akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:895) 在 akka.remote.EndpointWriter.writeSend(Endpoint.scala:786) 在 akka.remote.EndpointWriter$$anonfun$4.applyOrElse(Endpoint.scala:761) 在akka.actor.Actor.aroundReceive(Actor.scala:513) 在 akka.actor.Actor.aroundReceive$(Actor.scala:511) 在 akka.remote.EndpointActor.aroundReceive(Endpoint.scala:452) 在 akka.actor。 ActorCell.receiveMessage(ActorCell.scala:519) at akka.actor.ActorCell.invoke(ActorCell.scala:488) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) at akka.dispatch.Mailbox.run(Mailbox .scala:224) 在 akka.dispatch.Mailbox.exec(Mailbox.scala:234) 在 akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 在 akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask( ForkJoinPool.java:1339)在 akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 在 akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 由:java.io.NotSerializableException: com.our.member.object在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 在 java.io。 ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream .java:1509) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)在 akka.serializati on.JavaSerializer.$anonfun$toBinary$1(Serializer.scala:313) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) at scala.util.DynamicVariable.withValue( DynamicVariable.scala:58) atakka.serialization.JavaSerializer.toBinary(Serializer.scala:313) atakka.remote.serialization.MessageContainerSerializer.serializeSelection(MessageContainerSerializer.scala:37) atakka.remote.serialization.MessageContainerSerializer.toBinary(MessageContainerSerializer .scala:26) at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:47) ...省略了 17 个常用帧

【问题讨论】:

    标签: akka


    【解决方案1】:

    我今天收到这个错误,这个错误的原因是忘记在消息类中添加“implements Serializable”。错误消息和堆栈跟踪对于帮助我实现这一点绝对没有用。

    【讨论】:

      【解决方案2】:

      从您的消息看来,您正在使用 JavaSerialization(Akka 中的默认设置,但非常不鼓励用于生产环境)。

      Akka 只知道您正在序列化的顶级对象,然后由序列化程序提供一个好的错误消息。在这种情况下,JavaSerializatuoin 通常会为您提供它无法序列化的特定内容,然后您添加实现 Serializable 直到它工作为止。

      我建议您使用 protobuf 之类的东西来实现 Actor 系统之间的远程通信。

      【讨论】:

        猜你喜欢
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2012-08-29
        • 2011-10-06
        • 2012-12-06
        • 2012-10-19
        • 1970-01-01
        相关资源
        最近更新 更多