对于一个用 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,继续像现在一样运行,即不受限制?