上下文:一个无状态的 Web 服务(在 Glassfish 上运行),它使用 Akka Actor 来运行作业。该服务的结果存储在数据库中。
Web 服务客户端用于通过 Web 服务启动作业。这部分工作正常。我现在需要在不同的会话中,Web 客户端可以发送作业指令(我的 Akka 应用程序)以有序方式中断。最好的方法是向顶级参与者发送消息,然后向其参与者发送更多消息。
问题是,我不知道如何“从外部”向已经运行的 akka 应用程序的参与者发送消息?
任何指针将不胜感激!
上下文:一个无状态的 Web 服务(在 Glassfish 上运行),它使用 Akka Actor 来运行作业。该服务的结果存储在数据库中。
Web 服务客户端用于通过 Web 服务启动作业。这部分工作正常。我现在需要在不同的会话中,Web 客户端可以发送作业指令(我的 Akka 应用程序)以有序方式中断。最好的方法是向顶级参与者发送消息,然后向其参与者发送更多消息。
问题是,我不知道如何“从外部”向已经运行的 akka 应用程序的参与者发送消息?
任何指针将不胜感激!
我可以想到两种与你的演员交流的不同方式。
不久前我做了类似的事情来从 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)