首页 文章

如何追踪Akka序列化失败的根本原因?

提问于
浏览
0

从Akka获取序列化错误,如下所示,如何回绕Akka消息的违规非序列化成员/字段?该异常确定了无法序列化的成员值(在 com.our.member.object 下面),但该对象本身包含许多嵌套成员,并且错误消息似乎对于无法序列化的有问题的嵌套对象提供了一些线索:

2018-05-24T06:30:51.897Z错误VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter - 无法使用序列化程序[class akka.remote]序列化远程消息[class akka.actor.ActorSelectionMessage] . 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)at akka.remor.EndpointActor.aroundReceive(Endpoint.scala:452)at akka.actor . ActorCell.receiveMessage(ActorCell.scala:519)在akka.actor.ActorCell.invoke(ActorCell.scala:488)在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)在akka.dispatch.Mailbox.run(邮箱.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上的java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) . 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)at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)在akka.serializati在scala.util.DynamicVariable.withValue上的scala.runtime.java8.JFunction0 $ mcV $ sp.apply(JFunction0 $ mcV $ sp.java:12)上的on.JavaSerializer . $ anonfun $ toBinary $ 1(Serializer.scala:313) DynamicVariable.scala:58)akka.serialization.JavaSerializer.toBinary(Serializer.scala:313)at akka.remote.serialization.MessageContainerSerializer.serializeSelection(MessageContainerSerializer.scala:37)at akka.remote.serialization.MessageContainerSerializer.toBinary(MessageContainerSerializer) .scala:26)at akka.remote.MessageSerializer $ .serialize(MessageSerializer.scala:47)...省略了17个常用帧

1 回答

  • 0

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

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

    我建议你在演员系统之间进行远程通信时使用protobuf .

相关问题