2013-07-26 34 views
0

這裏是阿卡使用日程安排的一個基本的例子:附表阿卡 - 沒有找到

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 
    } 
} 

我真的很困惑阿卡的文檔。這裏Having problems with Akka 2.1.2 Scheduler ('system' not recognized)據說不是包導入,而是別的東西。那是什麼?

什麼是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 

回答

2

試試這個;)

val system = ActorSystem() 
val supervisor = system.actorOf(Props[Supervisor]) 
+0

這很好。爲什麼我不能將'import system.dispatcher'移動到所有其他導入語句?我導致en錯誤,但爲什麼? –

+0

因爲'系統'不在那裏。這只是你給'ActorSystem'的一個名字。 – agilesteel

+0

爲什麼我必須導入它,我可以使用全名來代替導入嗎?這個程序的名稱是什麼,我從來沒有見過這樣的事情。 –

1

(如發佈,因爲答案不適合作爲評論)

馬呂斯,你指的是哪個開始使用此行另外一個問題:

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

這是import語句所指的標識符'system'。 線

import system.dispatcher 

意味着變量系統的調度部件將在範圍(可以使用命名爲「調度」從該點參考「system.dispatcher」)可用。這也意味着自調度程序是隱含的,它現在可用於隱式解析。請注意,時間表的簽名是

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

因此,它需要顯式傳遞ExecutionContext或隱式傳遞。通過使用import語句,您可以將調度程序(這是一個ExecutionContext)納入範圍,因此您不必手動提供它。

+0

我可以通過使用全名避免使用'import system.dispatcher'來執行操作嗎? –

+0

你爲什麼要避免這種情況?無論如何,你可以這樣做 system.scheduleOnce(yourDelay)(yourTask)(system.dispatcher) 與您的代碼唯一的區別是現在第三個參數顯式傳遞並且未隱式解析。不過,您仍然需要將您的ActorSystem放入一個變量(在我的示例「系統」中)。 (內部演員可以通過'context.system'獲得) –

+0

我已經看過類似的代碼,我只使用導入來導入包。 –