上下文:无状态Web服务(在Glassfish上运行),它使用Akka actor来运行作业。此服务的结果存储在数据库中。
Web服务客户端用于通过Web服务启动作业。这部分工作正常。我现在需要在不同的会话中,Web客户端可以发送作业指令(我的Akka应用程序)以有序的方式中断。这将通过向顶级演员发送消息来做到最好,然后顶级演员将向其演员发送更多消息。
问题是,我不知道如何从“外部”向已经运行的akka应用程序的演员发送消息?
任何指针都会受到赞赏!
答案 0 :(得分:2)
我可以想到两种与你的演员沟通的不同方式。
我刚才做过这样的事情,从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)