2015-08-29 34 views
1

我試圖發送收到的http請求的內容到akka節點來處理。我已經嘗試了下面的內容類型和akka收到正確的消息。但是,當我發送AnyContentAsMultipartFormData時,akka不會接受它。播放框架發送AnyContentAsMultipartFormData消息到aka節點

我想知道爲什麼。

下面是我的日誌,通過發揮框架接收的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())) 

而阿卡日誌如下:

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] 

看來,這可能是問題。但我不知道如何解決它。

任何消息或指令,真的很感激。提前致謝。

+0

那麼,你沒有得到錯誤信息? – Kris

+0

我猜測:它與MultipartFormData的延遲加載有關,而Akka不喜歡它的Actors的可變狀態。嘗試從MultipartFormData中取出所有數據,然後將其交給演員。 – Kris

+0

謝謝你的回答。但問題只發生在節點之間。如果消息是在一個節點內發送的,那麼沒有任何丟失。但是,如果消息位於節點之間,那麼MultipartFormData將不會在遠程節點中看到。 –

回答

1

當你在節點之間發送消息時,它需要被序列化,因爲它們不像玩遊戲應用內部的actor系統那樣共享內存。錯誤消息說的是,它發現了一個它無法序列化的對象,它甚至足夠友好地告訴你它無法序列化的對象,在這種情況下,scala.collection.immutable.MapLike$$anon$2單詞「anon」暗示它是匿名的,像一個匿名的內部類或匿名函數。所以,玩MultipartFormData接受Map,在這種情況下,可能是內部包裹在Map的衣服可以這麼說。

我會避免在節點之間發送特定播放類的實例,而應該有一個包含您自己的模型類和不可變集合對象的自己的消息類的明確協議。這將有更容易測試和完全消除在akka節點中加載遊戲類的需要的額外好處。

+0

感謝您的回覆。我會按照你的指示。 –

相關問題