如何在访问URL时向actor发送tell消息?

时间:2017-01-10 12:51:20

标签: scala akka akka-http

我正在尝试将Akka HTTP与Actors连接起来。我有一个简单的演员收到“你好”并发回“Hello world”

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

我想在URL中访问/ hello时向TestActor发送一条tell消息,并显示消息“Hello World”作为响应。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

步骤1 - 创建Actor实例。

第2步 - 获取对它的引用。

第3步 - 发送消息

JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);",  webElement);

现在......

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

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

答案 1 :(得分:1)

您有两种选择。选项1是使用“询问”模式。你可以像下面一样“问”演员。 “Ask”返回您可以映射并执行其他操作的未来。您也可以在将来完成请求。这里需要注意的是它需要超时。您必须配置超时才能使其工作,这可能会在较大的项目中保持繁琐。

catchFn

选项2是使用“Tell”模式。这比“问”模式更受欢迎。你可以阅读这个here。您需要将请求上下文传递给新actor并使用该新actor完成请求。你会做类似下面的事情。

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

在testActor中,您将完成请求。您可以看到herehere以获取有关此模式的更多信息。