2012-05-04 18 views
2

.jarファイルからプラグインシステムを介してプレイヤーのボットコードをロードScalaで書かれたオープンソースのマルチプログラミングゲームのために、私はそれらを実行することにより、サーバシステム上の害を与えるボットのコードを防ぐしたいです限定的な実施形態ではSecurityManagerの実装である。特定のSecurityManagerを使用してAkka Futureを実行するにはどうすればよいですか?

現在の実装では、それに関連するプラグインの.jarファイルから各ボットの制御機能工場を抽出するためのURLClassLoaderを使用します。その後、ファクトリを使用して、ゲームの新しい各ラウンドごとにボットコントロール関数のインスタンスをインスタンス化します。次に、シミュレーションサイクルごとに一度、すべてのボット制御機能が同時に呼び出され、ボットの応答が環境に届きます。実行からボット・プラグインに含まれている悪意のあるコードを制限する

val future = Future.traverse(bots)(bot => Future { bot.respondTo(state) }) 
val result = Await.result(future, Duration.Inf) 

:同時呼び出しは、他の同時に動作コンポーネント(サービス、ウェブサーバ、レンダリングをコンパイル)によって共有暗黙的に提供さActorSystemとアッカのFuture.traverse()を用いて行われますthis StackOverflow questionthis oneで取られたパスに従っているように見えますが、適切に制限されたSecurityManagerの実装で実行されているスレッドでボット制御関数を実行する必要があります。

今の質問:システム内の他の俳優ながら、どのように私は、アッカは現在SecurityManagerを希望しているスレッドで実行されている俳優でFuture.traverse()で行われた作業を処理するために取得することができ、例えばバックグラウンドコンパイルサービスを実行しているユーザは、今のように、つまり無制限に実行し続けますか?

答えて

0

あなたは(例えば。ExecutionContext.fromExecutorService経由)ExecutionContextのインスタンスを作成することができ、制限、セキュリティマネージャの下ですべての作業を実行し、Future.applyFuture.traverseのために暗黙のスコープにそれを持っています。

呼び出される関数は、環境と相互作用する必要がない場合、私はあなたが別のActorSystemを必要としないと思います。

+0

申し訳ありませんが、Akka初心者ですが、どうすればいいですか? 'ExecutionContext.fromExecutorService()'は 'ExecutorService'を受け取ります。私は何を渡すべきですか?既存の 'ActorSystem'から' ExecutorService'を取得し、新しい 'SecurityManager'を使用するよう再設定する必要はありませんか? Akkaのソースに 'setSecurityManager'という文字列が含まれていないように見えることもありますが、これはおそらくここで起こる必要があります。自分の「ExecutorService」をロールする必要がありますか? – Scalatron

+0

'java.util.concurrent.ExecutorService'には、Java標準ライブラリが付属しています。 'Executor.newFixedThreadPool(5、新しいThreadFactory {def newThread(r:Runnable)= new MyRestrictiveThread(r)})'のような 'java.util.concurrent.Executors'のファクトリメソッドの1つを' ExecutorService 'これはあなたのカスタム制限的な' Thread'実装を使ってタスクを実行します。 –

+0

OK、ありがとう、私はそれをチェックします! – Scalatron

関連する問題