加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Akka远程actor,超类没有默认构造函数

发布时间:2020-12-16 19:09:47 所属栏目:安全 来源:网络整理
导读:我正在尝试使用akka远程actor发送消息,其中case类是在其构造函数中获取参数的超类的子类. 以下是重现问题的最小示例: package com.tuvistavie.testremoteimport akka.actor.{ Actor,ActorSystem,Props,ActorLogging }import com.typesafe.config.ConfigFact
我正在尝试使用akka远程actor发送消息,其中case类是在其构造函数中获取参数的超类的子类.

以下是重现问题的最小示例:

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),因为父节点的构造函数.
如果只有一两条消息,我知道我可以编写自己的序列化程序,但是我的应用程序中有很多这样的case类.

有没有简单的方法来使用远程演员传递这种对象?

解决方法

如果你像这样重组,事情就会奏效:

trait Foo{
  val a:Int
}
case class MessageFoo(a:Int) extends Foo

我通常尝试使用case类远离类继承.如果我需要能够将一组案例类作为抽象类型引用,我会使用特征.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读