2

对于一个用 Scala 编写的开源多人编程游戏,它通过插件系统从.jar文件中加载玩家的机器人代码,我想通过在限制条件下运行它们来防止机器人代码对服务器系统造成伤害SecurityManager执行。

当前实现使用 URLClassLoader 从其相关插件 .jar 文件中为每个机器人提取控制函数工厂。然后使用工厂为每一轮新的游戏实例化一个机器人控制函数实例。然后,每个模拟周期一次,同时调用所有机器人控制功能以获取机器人对其环境的响应。并发调用是使用 Akka 完成的Future.traverse(),其中隐式提供ActorSystem由其他并发操作组件(编译服务、Web 服务器、渲染)共享:

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

为了限制机器人插件中包含的潜在恶意代码运行,似乎遵循这个 StackOverflow 问题这个问题中采用的路径,我需要让机器人控制功能在适当限制性实现下运行的线程中SecurityManager执行。

现在的问题是:如何让 Akka 处理当前在Future.traverse()具有期望的线程中运行的Actors 完成的工作SecurityManager,而系统中的其他Actors,例如运行后台编译服务的 Actors,继续像现在一样运行,即不受限制?

4

1 回答 1

0

您可以构造一个ExecutionContext(例如 via ExecutionContext.fromExecutorService)的实例,该实例在限制性安全管理器下运行所有​​工作,并将其带入 and 的隐式Future.apply范围Future.traverse

如果调用的函数不需要与环境交互,我认为您不需要单独的ActorSystem.

于 2012-05-04T15:21:56.197 回答