0

コンテキスト: Akka アクターを使用してジョブを実行するステートレス Web サービス (Glassfish で実行)。このサービスの結果はデー​​タベースに保存されます。

Web サービス クライアントは、Web サービスによってジョブを起動するために使用されます。この部分は正常に動作します。ここで、別のセッションで、Web クライアントがジョブ (私の Akka アプリ) の指示を送信して、規則正しい方法で中断できるようにする必要があります。これは、最上位のアクターにメッセージを送信し、その後、そのアクターにさらにメッセージをディスパッチすることによって行うのが最適です。

問題は、既に実行されている akka アプリのアクターに「外部から」メッセージを送信する方法がわからないことです。

どんなポインタでもいただければ幸いです!

4

1 に答える 1

2

俳優とのコミュニケーションには 2 つの異なる方法が考えられます。

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