akka リモート アクターを使用してメッセージを送信しようとしています。ケース クラスは、コンストラクターで引数を取るスーパークラスのサブクラスです。
問題を再現するための最小限の例を次に示します。
package com.tuvistavie.testremote
import akka.actor.{ Actor, ActorSystem, Props, ActorLogging }
import com.typesafe.config.ConfigFactory
abstract class Foo(val a: Int)
case class MessageFoo(override val a: Int) extends Foo(a)
object Sender {
def main(args: Array[String]) {
val system = ActorSystem("Sender", ConfigFactory.load.getConfig("sender"))
val actor = system.actorFor("akka://Receiver@127.0.0.1:2552/user/receiver")
actor ! MessageFoo(1)
}
}
object Receiver {
class ReceiverActor extends Actor with ActorLogging {
def receive = {
case m: MessageFoo => log.debug(m.toString)
}
}
def main(args: Array[String]) {
val system = ActorSystem("Receiver", ConfigFactory.load.getConfig("receiver"))
val actor = system.actorOf(Props[ReceiverActor], "receiver")
}
}
このコードを実行すると、次のエラーが発生します。
[ERROR] [06/26/2013 02:53:16.132] [Receiver-9]
[NettyRemoteTransport(akka://Receiver@127.0.0.1:2552)]
RemoteServerError@akka://Receiver@127.0.0.1:2552] Error[java.io.InvalidClassException: com.tuvistavie.testremote.MessageFoo; no valid constructor]
akka.serialization.JavaSerializer
親のコンストラクターが原因で、メッセージを(を使用して)逆シリアル化できないためだと思います。1 つまたは 2 つのメッセージだけであれば、独自のシリアライザーを作成できることはわかっていますが、アプリケーションにはこのようなケース クラスがたくさんあります。
リモート アクターを使用してこの種のオブジェクトを渡す簡単な方法はありますか?