2016-11-15 106 views
0

我有下面的代碼,我需要運行大約100次:Akka緩存角色調用?

val system = ActorSystem("mySystem") 
    val myActorObject = system.actorOf(Props[MyActorClass], name = "myactor") 
    implicit val timeout = Timeout(60 seconds) 
    val future = myActorObject ? Request1 
    val result = Await.result(future, timeout.duration) 

的問題是:假設前兩個語句可以只調用一次,我應該緩存這些變量或阿卡,不是嗎?

+1

我不認爲阿卡正在緩存一些東西。不過,您可以在應用程序啓動時創建Actor,稍後再檢索它。此外,你可以在你的函數中注入ActorSystem。 –

+0

你需要撥打100次電話?這一行: __myActorObject? Request1__?如果是這樣的話,你可以在一個函數,一個演員或你想要的東西里面做。這取決於你想達到什麼目的。那麼,你想做什麼?創造100個演員?叫一個演員100次?無論如何,你可能需要通過隱式傳遞系統:__def f(request:String)(隱式系統:ActorSystem)= ??? __ – fGo

+0

@fGo否,我需要創建演員第一次我叫它並使用相同演員其餘的99次被稱爲 – ps0604

回答

1

不要讓演員系統創建和演員創建部分的重複代碼。一旦演員被創建。使用ActorRef可以儘可能多地完成。

val system = ActorSystem("mySystem") 
val myActorObject = system.actorOf(Props[MyActorClass], name = "myactor") 

像這樣的事情

val futureList = for(_ <- 1 to 1000) yield { 
    implicit val timeout = Timeout(60 seconds) 
    val future = myActorObject ? Request1 
} 

val finalF = Future.sequence(futureList) 

val result = Await.result(future, timeout.duration) 
+0

如何將系統和演員創建包裝在一個函數中? – ps0604

+0

你不需要把它們包裝在一個函數中。只需在程序啓動期間創建演員系統,然後根據需要創建儘可能多的演員。但不要創建多個演員系統。 – pamu

+0

我正在使用Play,不會在程序開始時創建系統/ actor(作爲類構造函數)創建競爭條件? – ps0604

1

在玩! (+ 2.5.x)你可以通過注入獲得系統。例如

@Singleton 
class MyController @Inject() (system: ActorSystem) extends Controller { 

    val myActor = system.actorOf(MyActorClass.props, "myactor") 

    //... 
} 

然後你可以有一個端點調用演員多次,只要你想,例如

def sayHello(name: String) = Action.async { 
    (myActor ? name).map { message => Ok(message) } 
} 

你的演員內的代碼可以是這樣的

class MyActorClass extends Actor { 
    def receive = { 
    case name: String => sender() ! s"hello $name" 
    } 
} 

object MyActorClass { 
    def props: Props = Props(classOf[MyActorClass ]) 
} 
+0

爲什麼使用'Action.async'?我通常定義一個'receive'方法來運行actor動作。你爲什麼定義了@Singleton? – ps0604

+0

@ ps0604我將它定義爲async,因爲結果是Future [結果]。你的第二個問題可以通過http://stackoverflow.com/questions/37282792/why-use-singleton-over-scalas-object-in-play-framework – fGo

+0

@ ps0604來解答_receive_函數進入actor代碼中。我在這裏展示的是用於向演員發送消息的播放控制器。 – fGo