2016-11-15 1 views
0

У меня есть следующий код, который я должен работать около 100 раз:Вызывает ли актерский призыв аккера?

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) 

вопрос: если предположить, что первые два утверждения могут быть вызваны только один раз, я должен кэшировать эти переменные или Akka делает это?

+1

Я не думаю, что Акка что-то кэширует. Однако вы можете создать своего Актера при запуске своего приложения и получить его позже. Кроме того, вы можете ввести 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, не создавая систему/актера в начале программы (как конструктор класса), создавая условие гонки? – 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' для запуска действий актера. Почему вы определили @Singleton? – ps0604

+0

@ ps0604 Я определил его как асинхронный, потому что результат - это будущее [Результат]. На ваш второй вопрос можно ответить http://stackoverflow.com/questions/37282792/why-use-singleton-over-scalas-object-in-play-framework – fGo

+0

@ ps0604 функция _receive_ входит в код актера. То, что я показываю вам, это Play Controller, используемый для отправки сообщений актеру. – fGo