【问题标题】:Akka: defining an actor in Scala with non-default constructor and creating it from Java codeAkka:在 Scala 中使用非默认构造函数定义一个actor并从 Java 代码创建它
【发布时间】:2012-06-11 03:26:12
【问题描述】:

Akka Scala actor 必须扩展 akka.actor.Actor

Akka Java Actor 必须扩展 akka.actor.UntypedActor

因此,在使用非默认构造函数定义 Scala Actor 并从 Java 代码创建它时,我遇到了这个问题:

ActorRef myActor = system.actorOf(new Props(new UntypedActorFactory() {
  public UntypedActor create() {
    return new MyActor("...");
  }
}), "myactor");

当然,UntypedActorFactory 期望创建一个 UntypedActor 类型的对象,但我的 Actor 是 Actor 类型。

解决方法是什么?

编辑:

按照 Viktor 的说明使用 akka.japi.Creator,此方法有效:

Props props1 = new Props();
Props props2 = props1.withCreator(new akka.japi.Creator() {
        public Actor create() {
            return new MyActor("...");
        }
    });
ActorRef actorRef = Main.appClient().actorOf(props2, "myactor");

【问题讨论】:

    标签: java scala actor akka


    【解决方案1】:

    在这种情况下,传入 akka.japi.Creator 而不是 UntypedActorFactory。

    此外,至少在 2.0.1 及更高版本中,它不需要 UntypedActor:

    trait UntypedActorFactory extends Creator[Actor] with Serializable
    

    https://github.com/akka/akka/blob/v2.0.1/akka-actor/src/main/scala/akka/actor/UntypedActor.scala#L161

    【讨论】:

    • 谢谢维克多!我很可能会更新我的 Akka 版本。同时,我按照您的说明在我的问题中添加了示例代码。我必须分两步创建道具,因为道具没有接受 akka.japi.Creator 的构造函数。
    • 它有一个工厂: def apply(creator: Creator[_ <: actor props="default.withCreator(creator.create)" props.apply ...>
    • 或者。 Props.default().withCreator(yourCreator)
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2014-03-26
    • 2018-07-17
    • 2010-09-22
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多