Playframework 播放框架向akka节点发送任何内容MultipartFormData消息

Playframework 播放框架向akka节点发送任何内容MultipartFormData消息,playframework,akka,Playframework,Akka,我正在尝试将收到的http请求的内容发送到akka节点进行处理。我尝试了以下内容类型,akka正确地收到了消息。但是,当我发送任何内容为MultipartFormData时,akka不会接受它 我想知道为什么 下面是play framework收到http请求的日志: 2015-08-29 15:05:08.952 [INFO] [application] in application-akka.actor.default-dispatcher-5 body is AnyContentAsFo

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

我想知道为什么

下面是play framework收到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({})
无法接收任何内容MultipartFormData

我想知道是否有办法解决这个问题

经过一段时间的测试后,我遇到了以下异常:

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]
看来这可能就是问题所在。但我不知道怎么解决它


任何信息或指示都非常感谢。提前感谢。

当您在节点之间发送消息时,需要对其进行序列化,因为它们不像play应用程序中的actor系统那样共享内存。错误消息说,它遇到了一个无法序列化的对象,它甚至友好地告诉您它无法序列化的对象,在本例中,
scala.collection.immutable.MapLike$$anon$2
这个词暗示它是匿名的,类似于匿名内部类或匿名函数。因此,play
MultipartFormData
接受一个
Map
,在本例中,它可能是play内部包装在
Map
s衣服中的东西


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

因此,您没有收到错误消息吗?我猜:这与延迟加载MultipartFormData有关,akka不喜欢其参与者的可变状态。在将MultipartFormData交给参与者之前,请尝试从中获取所有数据。谢谢您的友好回答。但问题只发生在节点之间。如果消息是在一个节点内发送的,则不会丢失任何消息。但是,如果消息在节点之间,则在远程节点中将看不到MultipartFormData。感谢您的回复。我会听从你的指示。