俳優とのコミュニケーションには 2 つの異なる方法が考えられます。
- クライアントがメッセージの送信先のアクターの名前を知っていて、リモーティング ( http://doc.akka.io/docs/akka/snapshot/scala/remoting.html ) が有効になっている場合、ActorSystem クライアントを作成できます。 -側で、問題のアクターへの ActorSelection を取得し、この ActorSelection を使用してメッセージを送信します。
- スプレー ( 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)