0

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

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

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

任何指针将不胜感激!

4

1 回答 1

2

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

  1. 如果您的客户端知道要将消息发送到的参与者的名称并启用远程处理(http://doc.akka.io/docs/akka/snapshot/scala/remoting.html),您可以创建一个 ActorSystem 客户端-side,将 ActorSelection 获取给有问题的演员,并使用此 ActorSelection 发送消息。
  2. 您可以使用像 spray ( http://spray.io/documentation/ ) 之类的东西来创建一个服务来侦听来自您的客户端的任何消息。

不久前我做了类似的事情来从 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)
于 2013-08-21T09:47:50.980 回答