如何从应用程序“外部”访问Akka演员?通过它的pid或等价物?

时间:2013-08-21 07:29:08

标签: akka

上下文:无状态Web服务(在Glassfish上运行),它使用Akka actor来运行作业。此服务的结果存储在数据库中。

Web服务客户端用于通过Web服务启动作业。这部分工作正常。我现在需要在不同的会话中,Web客户端可以发送作业指令(我的Akka应用程序)以有序的方式中断。这将通过向顶级演员发送消息来做到最好,然后顶级演员将向其演员发送更多消息。

问题是,我不知道如何从“外部”向已经运行的akka​​应用程序的演员发送消息?

任何指针都会受到赞赏!

1 个答案:

答案 0 :(得分:2)

我可以想到两种与你的演员沟通的不同方式。

  1. 如果您的客户端知道要将消息发送到的actor的名称,并且启用了Remoting(http://doc.akka.io/docs/akka/snapshot/scala/remoting.html),您可以创建一个ActorSystem客户端,获取有关actor的ActorSelection并使用这个ActorSelection发送消息。
  2. 您可以使用类似喷雾(http://spray.io/documentation/)之类的内容来创建侦听来自客户端的任何消息的服务。
  3. 我刚才做过这样的事情,从Web客户端与我的ActorSystem交谈。哪种看起来像这样:

    import akka.actor.{ActorLogging, Actor}
    import scala.concurrent.duration._
    import spray.http._
    import HttpMethods._
    
    
    class LoggingService extends Actor with ActorLogging {
      implicit val timeout = 1.second
    
    
      def receive = {
        case HttpRequest(POST, "/logging", _, entity, _) =>
          val interaction = entity.asString.asJson.convertTo[UserActivity]
    
          interaction match {
            case UserActivity(program, time, "WebActivity:begin", uri, title) => ...
          }
    
        case h: HttpRequest =>
          sender ! HttpResponse(StatusCodes.NotFound, entity = "Unknown resource!")
      }
    }
    

    对于ActorSystem,我添加了以下内容来启动服务:

    val system = ActorSystem("logging-server")
    val ioBridge = IOExtension(system).ioBridge
    
    val requestHandler = system.actorOf(Props[LoggingService])
    
    val server = system.actorOf(
        props = Props(new HttpServer(ioBridge, SingletonHandler(requestHandler))),
        name = "logging-service"
    )
    
    
    server ! HttpServer.Bind(uri, port)