1

私の環境はscala akkaと遊びです!フレームワーク。とにかくアクターシステムの作成を制御する方法や、できる他のアイデアがあるかどうか疑問に思っていました.

私の考えは、ユーザーが購入したときに承認を処理するリモート アクターを作成することです。そこで、ユーザーが投稿したときにアクション メソッドでリモート アクター システムとアクターを作成します。

def payment = Action { implicit request =>
  var actorObject: Array[String] = new Array[String](23)

  val system = ActorSystem("RemoteSystem", ConfigFactory.load.getConfig("remotecreation")

  val worker = system.actorOf(Props[authNetActor.AuthNetActorMain].withRouter(FromConfig()), name = "remoteActor")
  ...
  system.shutdown()
}

application.conf の remotecreation の定義は次のとおりです。

remotecreation {        #user defined name for the configuration
    include "common"
    akka {
            actor {
                    serialize-messages = on
                    serialize-creators = on

                    serializers {
                            proto = "akka.serialization.ProtobufSerializer"
                            java = "akka.serialization.JavaSerializer"
                            arr = "models.ArraySerializer"
                    }

                    serialization-bindings {
                            "com.google.protobuf.Message" = proto
                            "java.lang.String" = java
                            "java.util.Arrays" = java
                            "scala.Array" = arr
                            "akka.actor.ActorRef" = java
                    }

                    deployment {
                            /remoteActor {  #Specifically has to be the name of the remote actor
                                    remote = "akka://ActorApplication@172.17.100.232:2552"
                                    router = "round-robin"
                                    nr-of-instances = 1
                            }
                    }
            }
            remote.netty.port = 2554
    }
}

私が抱えている問題は、既にアクター システムが存在する IP アドレスでアクター システムを作成しようとしているため、2 回続けて送信するとエラーが発生することです。

私は間違いなくそれを移動する必要があると思いますが、これは幅広いマルチユーザープレイになるため、どこにあるのかわかりません! 何百人ものユーザーがアプリケーションを使用する場合、競合することなくアクター システムの作成をどこに置くことができるかわかりません。

任意の考え、提案、またはヘルプをいただければ幸いです。

4

1 に答える 1

3

呼び出しごとに (リモート) ActorSystem を開始しないでください。代わりに、アプリケーション全体のアクター システムを起動します (または、デフォルトのアクター システムを使用します。Play と Akka の統合を参照してください)。

あなたに追加application.conf

akka {

  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }

  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
    netty {
      hostname = "127.0.0.1"
      port = 0 # 2552 seems to be bound with play 2.0.2 ?
    }
  }
}

次に、たとえばデフォルトの Play アクターシステムを使用して、コントローラーでリモート アクターへの参照を取得します。

private val interpreters = Akka.system.actorFor(
  "akka://interpreter_system@127.0.0.1:2552/user/interpreters")

アクターの応答をレンダリングする場合は、Akka Future を Scala Promise に変換することもできます。構成可能性のために Akka Futures を使用し続け、最後のステムでFuture[Result]を Promise に変換することをお勧めします。

new AkkaPromise(
  interpreters.ask(InterpretersComm.Request(sid, line)).mapTo[String]) map (Ok(_))
于 2012-09-22T06:36:02.547 に答える