0

这是在 Akka 中使用 schedule 的基本示例:

import akka.pattern
import akka.util.Timeout
import scala.concurrent.Await
import akka.actor.Actor
import akka.actor.Props
import akka.actor.ActorSystem
import akka.pattern.ask
import scala.concurrent.duration

object Application extends App {
  val supervisor = ActorSystem().actorOf(Props[Supervisor])
  implicit val timeout = Timeout(10 seconds)
  import system.dispatcher

  supervisor.scheduler.scheduleOnce(120 seconds) {
    val future = supervisor ? Supervisor.Start
    val resultIdList = Await.result(future, timeout.duration).asInstanceOf[List[MyIdList]]
    supervisor ! resultIdList
  }
}

我真的对 Akka 的文档感到困惑。这里说Akka 2.1.2 Scheduler 出现问题(“系统”无法识别)import system.dispatcher不是包导入,而是其他东西。那是什么?

是什么system?我必须用 替换它supervisor吗?即使我不这样做并继续使用system,我也会遇到几乎相同的错误:

//(using system)
value scheduler is not a member of akka.actor.ActorRef
not found: value system

//or (using supervisor)

not found: value system
not found: value system
4

2 回答 2

2

尝试这个 ;)

val system = ActorSystem()
val supervisor = system.actorOf(Props[Supervisor])
于 2013-07-26T09:34:32.910 回答
1

(作为答案发布,因为不适合作为评论)

Marius,您指的是从这一行开始的另一个问题:

val system = akka.actor.ActorSystem("system")

那就是导入语句所指的标识符“系统”。线

import system.dispatcher

意味着变量系统的调度程序成员将在范围内可用(您可以使用名称'dispatcher'来引用'system.dispatcher')。这也意味着,由于调度程序是隐式的,因此它现在可用于隐式解析。请注意,时间表的签名是

scheduleOnce(delay: FiniteDuration, runnable: Runnable)(implicit executor: ExecutionContext): Cancellable 

所以它要么需要一个显式传递的 ExecutionContext,要么需要一个隐式传递。通过使用 import 语句,您将调度程序(它是一个 ExecutionContext)带入范围,因此您不必手动提供它。

于 2013-07-26T10:24:37.803 回答