0

Akka でスケジュールを使用する基本的な例を次に示します。

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 に問題がある ('system' が認識されない)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

1

(コメントとして収まらないため、回答として投稿)

マリウス、あなたはこの行で始まる別の質問に言及していました:

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

それは、インポートステートメントが参照している識別子「システム」です。この線

import system.dispatcher

変数システムのディスパッチャー メンバーがスコープ内で使用可能になることを意味します (「dispatcher」という名前を使用して、その時点から「system.dispatcher」を参照できます)。これは、dispatcher が暗黙的であるため、暗黙的な解決に使用できるようになることも意味します。スケジュールの署名は

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

したがって、明示的に渡された ExecutionContext、または暗黙のいずれかが必要です。import ステートメントを使用すると、ディスパッチャー (ExecutionContext) をスコープに入れることができるため、手動で提供する必要はありません。

于 2013-07-26T10:24:37.803 に答える