当前位置: 首页 > 知识库问答 >
问题:

为什么Akka在生孩子的时候会被吊死

梅欣然
2023-03-14

我试图实现一个A/B测试机制,使用Akka演员(scala 2.12.8akka演员类型2.6.1

我把它设计成:

当A/B测试参与者收到消息时,它将选择一个变体并将消息转发给它。

然而,直到现在,我还没有设法让根演员产生它的孩子。这是我的密码。

import akka.actor.typed.{ActorRef, ActorSystem, Behavior}
import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}

import scala.util.Random

// My variants
object Ranker {
  sealed trait Command
  final case class Rank() extends Command
  def apply(rank: Int): Behavior[Command] = Behaviors.setup { context => new Ranker(context, rank) }
}

class Ranker(context: ActorContext[Ranker.Command], rank: Int) extends AbstractBehavior[Ranker.Command](context) {
  override def onMessage(msg: Ranker.Command): Behavior[Ranker.Command] = {
    println(rank)
    this
  }
}

// The root A/B Testing actor
object ABTester {
  def apply(): Behavior[Ranker.Command] = Behaviors.setup { context => new ABTester(context) }
}

class ABTester(context: ActorContext[Ranker.Command]) extends AbstractBehavior[Ranker.Command](context) {
  val rng = new Random()
  // Spawn children actors
  val rankers: Seq[ActorRef[Ranker.Command]] = Seq(Ranker(1), Ranker(2)).zipWithIndex
    .map { case (b, i) =>
      println(s"Spawning ranker $i")
      val actorRef = context.spawn(b, s"Ranker $i")
      println(s"Spawning ranker $i: Done")
      actorRef
    }

  override def onMessage(msg: Ranker.Command): Behavior[Ranker.Command] = {
    rankers(rng.nextInt(rankers.size)) ! msg
    this
  }
}

// Application entry point
object Main {
  def main(args: Array[String]): Unit = {
    val actor = ActorSystem(ABTester(), "ABTester")
    actor ! Ranker.Rank()
    Thread.sleep(5000)
  }
}

运行此示例将打印:

Spawning ranker 0

但仅此而已,好像第31行(val actorRef=context.spawn(b,s"Ranker$i"))永远不会返回...

我是否错过了一些关于儿童演员繁殖的事情?

共有1个答案

仲浩歌
2023-03-14
Actor paths MUST:
  not start with `$`,
  include only ASCII letters
  and can only contain these special characters: -_.*$+:@&=,!~';.`

我终于发现了错误!

我没有正确设置日志记录,因此错误消息从未出现。添加slf4j simple依赖项后,会发生以下情况:

[ABTester-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
SLF4J: A number (1) of logging calls during the initialization phase have been intercepted and are
SLF4J: now being replayed. These are subject to the filtering rules of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#replay
[ABTester-akka.actor.default-dispatcher-3] INFO ABTester - Spawning ranker 0
[ABTester-akka.actor.default-dispatcher-3] ERROR akka.actor.LocalActorRefProvider(akka://ABTester) - guardian failed, shutting down system
akka.actor.InvalidActorNameException: Invalid actor path element [Ranker 0], illegal character [ ] at position: 6. Actor paths MUST: not start with `$`, include only ASCII letters and can only contain these special characters: -_.*$+:@&=,!~';.
    at akka.actor.ActorPath$.validatePathElement(ActorPath.scala:98)
    at akka.actor.ActorPath$.validatePathElement(ActorPath.scala:76)
    at akka.actor.dungeon.Children.checkName(Children.scala:248)
    at akka.actor.dungeon.Children.actorOf(Children.scala:47)
    at akka.actor.dungeon.Children.actorOf$(Children.scala:46)
    at akka.actor.ActorCell.actorOf(ActorCell.scala:408)
    at akka.actor.typed.internal.adapter.ActorRefFactoryAdapter$.spawn(ActorRefFactoryAdapter.scala:41)
    at akka.actor.typed.internal.adapter.ActorContextAdapter.spawn(ActorContextAdapter.scala:66)
    at ABTester.$anonfun$rankers$1(ABTester.scala:31)
    [...]

演员路径(传递给spawn方法)不能包含任何空格。

Ranker$i更改为Ranker\u$i会导致:

[ABTester-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 0
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 0: Done
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 1
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 1: Done
[ABTester-akka.actor.default-dispatcher-3] INFO Ranker - rank: 2
 类似资料:
  • 本文向大家介绍render在什么时候会被触发?相关面试题,主要包含被问及render在什么时候会被触发?时的应答技巧和注意事项,需要的朋友参考一下 在 React 中,只要执行了 setState 方法,就一定会触发 render 函数执行; 组件的 props 改变了,不一定触发 render 函数的执行,除非 props 的值来自于父组件或者祖先组件的 state

  • 问题内容: 我有一个设置为启动Java活动(称为MyJavaActivity)的android应用,这反过来又会启动NativeActivity。NativeActivity完成后,它将返回到MyJavaActivity。 我还有一个Java单例类(称为MyJavaSingleton),我希望在应用程序的整个生命周期中都将其保留在内存中。我从NativeActivity(使用JNI)中设置了一些单

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 我有一个Android应用程序,每个屏幕分辨率包含大约150个图标。 如果我把所有图标放在所有5个主要分辨率(ldpi、mdpi、hdpi、xhdpi、xxhdpi)中,那么图标总数将达到750个。这有几个缺点: 大APK大小 将dexGuard与ant构建脚本一起使用时构建过程缓慢。它对图像进行一些处理需要一些时间。 或者,我可以只在一些分辨率中放置图标。例如,ldpi设备现在仅占市场的10%,

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方