2017-01-10 2 views
0

Я пытаюсь подключить Akka HTTP с Актерами. У меня есть простой актер, который получает «привет» и посылает обратно «Привет мир»Как отправить актору сообщение-сообщение при обращении к URL-адресу?

class TestActor extends Actor{ 
    def receive={ 
    case "hello"=>{ 
     sender!"Hello World" 
    } 
    } 
} 

я определил ниже маршрут:

object Main extends App{ 

    val route1: Route = 
    get { 
     path("hello") { 
     complete { 
      "This is hello" 
     } 
     } 
    } 

    implicit val materializer = ActorMaterializer() 
    implicit val system = ActorSystem("h") 
    Http().bindAndHandle(route1, "localhost", 8185) 
} 

Я хочу, чтобы отправить сообщение поведать TestActor, когда/Приветствуется обращение по URL-адресу и отображает сообщение «Hello World» в качестве ответа. Как я могу это сделать?

ответ

1

У вас есть два варианта. Вариант 1 - использовать шаблон «Спросить». Вы можете «спросить» актера, как показано ниже. «Спросить» возвращает будущее, которое вы можете отобразить и выполнить другие операции. Вы также можете выполнить запрос в будущем. Оговорка здесь в том, что для этого требуется тайм-аут. Вам нужно настроить тайм-аут для работы, который может стать утомительным для поддержки в более крупном проекте.

implicit val timeout: Timeout = 2 seconds 
val responseFuture = (actor ? message).mapTo[String] // This will return a Future[String] 
complete(responseFuture) 

Вариант 2 - использовать шаблон «Сообщить». Это гораздо предпочтительнее, чем шаблон «спросить». Вы можете прочитать об этом here. Вам нужно передать контекст запроса новому актеру и выполнить запрос с этим новым актером. Вы сделаете что-то вроде ниже.

val testActor = actorSystem.actorOf(Props(classOf[TestActor], reqContext), "test-actor") 

И в testActor вы заполните запрос. Вы можете увидеть here и here, чтобы получить более подробную информацию об этом шаблоне.

1

Шаг 1 - Создайте экземпляр актера.

Шаг 2 - Получите ссылку на него.

Шаг 3 - Отправить это сообщение

class TestActor extends Actor{ 
    def receive = { 
    case "hello" => { 
     sender() ! "Hello World" 
    } 
    } 
} 

object TestActor { 
    def props: Props = Props(classOf[TestActor]) 
} 

Теперь ...

import akka.pattern.ask 

object Main extends App{ 

    val actorSystem = ActorSystem("actor-system") 

    implicit val implicitActorSystem = actorSystem 
    implicit val materializer = ActorMaterializer() 

    // actually create the actor 
    val testActor = actorSystem.actorOf(TestActor.props, "test-actor") 

    val route1: Route = 
    get { 
     path("hello") { 
     // get actor's reference using selection 
     val testActorSelection = actorSystem.actorSelection("/user/test-actor") 
     // now send using selection 
     val responseFuture = testActorSelection ? "hello" 

     // or send using the "val testActor" reference which we already have 
     val responseFuture = testActor ? "hello" 

     onComplete(responseFuture) { 
      case Success(message) => complete(message) 
      case Failure(ex) => complete(ex.message) 
     } 
     } 
    } 

    Http().bindAndHandle(route1, "localhost", 8185) 
} 
+0

Я немного изменил код и мое требование. Актер отправляет сообщение вместо печати. Это сообщение должно отображаться как ответ. – codingsplash

+0

ну ... в этом случае вы можете использовать директиву 'onComplete'. –

+0

Но я не хочу этого делать с просьбой. Я хочу, чтобы это было сказано. – codingsplash

Смежные вопросы