【问题标题】:Play framework send AnyContentAsMultipartFormData message to akka node播放框架向 akka 节点发送 AnyContentAsMultipartFormData 消息
【发布时间】:2015-08-31 03:10:55
【问题描述】:

我正在尝试将收到的 http 请求的内容发送到 akka 节点进行处理。我尝试了以下内容类型,并且 akka 正确收到了消息。但是,当我发送AnyContentAsMultipartFormData 时,akka 不会接受。

我想知道为什么。

以下是我的播放框架收到的 http 请求的日志:

2015-08-29 15:05:08.952 [INFO] [application] in application-akka.actor.default-dispatcher-5 
body is AnyContentAsFormUrlEncoded(Map(test -> ArrayBuffer(test)))
2015-08-29 15:06:31.867 [INFO] [application] in application-akka.actor.default-dispatcher-18 
body is AnyContentAsText({})
2015-08-29 15:08:23.787 [INFO] [application] in application-akka.actor.default-dispatcher-18 
body is AnyContentAsJson({})
2015-08-29 15:09:07.290 [INFO] [application] in application-akka.actor.default-dispatcher-6 
body is AnyContentAsMultipartFormData(MultipartFormData(Map(abc -> List(2), test -> List(1)),List(),List(),List()))

而akka日志如下:

2015-08-29 15:05:09.146 [INFO] [actors.PlatService] in application-akka.actor.default-dispatcher-2 
body is AnyContentAsFormUrlEncoded(Map(test -> ArrayBuffer(test)))

2015-08-29 15:06:31.893 [INFO] [actors.PlatService] in application-akka.actor.default-dispatcher-17 
body is AnyContentAsText({})

2015-08-29 15:08:23.935 [INFO] [actors.PlatService] in application-akka.actor.default-dispatcher-18 
body is AnyContentAsJson({})

AnyContentAsMultipartFormData 只是无法接收。

我想知道有没有办法解决这个问题?

经过一点测试,我遇到了这个异常:

2015-08-30 16:02:01.787 [ERROR] [akka.remote.EndpointWriter] in application-akka.actor.default-dispatcher-5 
Transient association error (association remains live)
java.io.NotSerializableException: scala.collection.immutable.MapLike$$anon$2
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) ~[na:1.8.0_45]
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) ~[na:1.8.0_45]
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply$mcV$sp(Serializer.scala:234) ~[com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:234) ~[com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:234) ~[com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) ~[org.scala-lang.scala-library-2.11.6.jar:na]
    at akka.serialization.JavaSerializer.toBinary(Serializer.scala:234) ~[com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.remote.serialization.MessageContainerSerializer.serializeSelection(MessageContainerSerializer.scala:45) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.serialization.MessageContainerSerializer.toBinary(MessageContainerSerializer.scala:34) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:37) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:837) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:837) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) ~[org.scala-lang.scala-library-2.11.6.jar:na]
    at akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:836) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.EndpointWriter.writeSend(Endpoint.scala:737) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.remote.EndpointWriter$$anonfun$4.applyOrElse(Endpoint.scala:712) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.actor.Actor$class.aroundReceive(Actor.scala:480) ~[com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.remote.EndpointActor.aroundReceive(Endpoint.scala:405) ~[com.typesafe.akka.akka-remote_2.11-2.4.0-RC1.jar:na]
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:525) [com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.actor.ActorCell.invoke(ActorCell.scala:494) [com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) [com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.dispatch.Mailbox.run(Mailbox.scala:224) [com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at akka.dispatch.Mailbox.exec(Mailbox.scala:234) [com.typesafe.akka.akka-actor_2.11-2.4.0-RC1.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [org.scala-lang.scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [org.scala-lang.scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [org.scala-lang.scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [org.scala-lang.scala-library-2.11.6.jar:na]

看来这可能是问题所在。但是不知道怎么解决。

非常感谢任何消息或说明。提前致谢。

【问题讨论】:

  • 那么,您没有收到错误消息吗?
  • 我猜:这与 MultipartFormData 的延迟加载有关,而 Akka 不喜欢其 Actor 的可变状态。尝试从 MultipartFormData 中获取所有数据,然后再将其交给 Actor。
  • 感谢您的友好回答。但问题只发生在节点之间。如果消息是在一个节点内发送的,那么就没有任何遗漏。但是,如果消息在节点之间,那么 MultipartFormData 将不会在远程节点中看到。

标签: playframework akka


【解决方案1】:

当您在节点之间发送消息时,它需要被序列化,因为它们不像 play 应用程序内部的 actor 系统那样共享内存。错误消息说的是它遇到了一个无法序列化的对象,它甚至足够友好地告诉您它无法序列化的确切对象,在这种情况下scala.collection.immutable.MapLike$$anon$2“anon”这个词暗示它是匿名,如匿名内部类或匿名函数。所以,MultipartFormData 的游戏接受了 Map,在这种情况下,这可能是游戏内部包裹在 Maps 衣服中的东西。

我会完全避免在节点之间发送播放特定类的实例,而是拥有一个包含您自己的模型类和不可变集合对象的自己的消息类的清晰协议。这将带来额外的好处,即更容易测试并完全消除在 akka 节点中加载播放类的需要。

【讨论】:

  • 感谢您的回复。我会听从你的指示。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2015-07-30
  • 2021-07-26
  • 2013-04-30
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多