源码阅读之ActorSystem创建(akka-actor-typed 2.6.5)

构建ActorSystem

核心代码如下:

 val system = new classic.ActorSystemImpl(
      name,
      appConfig,
      cl,
      executionContext,
      Some(
        PropsAdapter[Any](() => GuardianStartupBehavior(guardianBehavior), guardianProps, rethrowTypedFailure = false)),
      setup)
    system.start()

    system.guardian ! GuardianStartupBehavior.Start
    ActorSystemAdapter.AdapterExtension(system).adapter

1 需要的参数如下:

  • name:系统名称
  • appConfig:应用设置
  • cl:类加载器
  • executionContext:执行上下文,可以查看scala.concurrent.ExecutionContext类查看更多信息。
  • 这个参数其实是系统Actor。
  • setup:系统设置

2 构建的逻辑如下:

  • 构建完ActorSystem对象。
  • 调用ActorSystem对象的start函数,启动系统。
  • 向guardian发送启动命令。
  • 对系统做了一定的适配。

ActorSystem start

核心代码如下:

private lazy val _start: this.type = try {

    registerOnTermination(stopScheduler())
    // the provider is expected to start default loggers, LocalActorRefProvider does this
    provider.init(this)
    // at this point it should be initialized "enough" for most extensions that we might want to guard against otherwise
    _initialized = true

    if (settings.LogDeadLetters > 0)
      logDeadLetterListener = Some(systemActorOf(Props[DeadLetterListener](), "deadLetterListener"))
    eventStream.startUnsubscriber()
    ManifestInfo(this).checkSameVersion("Akka", allModules, logWarning = true)
    if (!terminating)
      loadExtensions()
    if (LogConfigOnStart) logConfiguration()
    this
  } catch {
    case NonFatal(e) =>
      try terminate()
      catch { case NonFatal(_) => Try(stopScheduler()) }
      throw e
  }

1 核心步骤如下:

  • 设置系统停止时的执行stopScheduler停止调度。
  • LocalActorRefProvider初始化
  • 将初始化的标志设为ture
  • 检查版本是否一致。

你可能感兴趣的:(Akka,Actor源码阅读)