Sto tentando di inviare un messaggio usando gli attori remoti akka, dove la classe case è una sottoclasse di una superclasse che prende argomento nel suo costruttore.Attori remoti Akka, superclasse senza costruttore predefinito
Ecco un esempio minima per riprodurre il problema:
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://[email protected]: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")
}
}
Quando si esegue questo codice, ottengo il seguente errore:
[ERROR] [06/26/2013 02:53:16.132] [Receiver-9]
[NettyRemoteTransport(akka://[email protected]:2552)]
[email protected]://[email protected]:2552] Error[java.io.InvalidClassException: com.tuvistavie.testremote.MessageFoo; no valid constructor]
Penso che sia perché il messaggio non può essere deserializzato (usando akka.serialization.JavaSerializer
), a causa del costruttore dei genitori. Se fosse solo uno o due messaggi so che potrei scrivere il mio serializzatore, ma ho molte classi di casi come questo nella mia applicazione.
Esiste un modo semplice per passare questo tipo di oggetto utilizzando gli attori remoti?
Potete spiegare cosa sta succedendo qui? Né il 'MessageFoo' della domanda né il tuo hanno un costruttore no-arg. Perché si lavora con la serializzazione Java quando l'altra no? –
@DanielDarabos, le classi di caso scala sono serializzabili. Se si guarda il codice java generato per una classe di case, si vedrà che soddisfa il contratto per essere serializzabile. – cmbaxter
Ma la classe del caso nella domanda non può essere deserializzata, giusto? –