对于一个用Scala编写的开源多人编程游戏,它通过.jar文件中的插件系统加载玩家的bot代码,我想通过在限制性的SecurityManager实现下运行它们来防止机器人的代码对服务器系统造成危害。
当前的实现使用URLClassLoader从其相关的插件.jar文件中提取每个bot的控制函数工厂。然后,工厂用于为游戏的每一轮实例化一个bot控制函数实例。然后,每次模拟周期一次,同时调用所有bot控制功能,以获得bot对其环境的响应。并发调用使用Akka的Future.traverse()与其他并发操作组件(编译服务、web服务器、呈现)共享的隐式ActorSystem完成:
val future = Future.traverse(bots)(bot => Future { bot.respondTo(state) })
val result = Await.result(future, Duration.Inf)为了限制包含在bot插件中的潜在恶意代码的运行,似乎按照this StackOverflow question和this one中的路径,我需要在在适当限制的SecurityManager实现下运行的线程中执行bot控制函数。
现在的问题是:如何让Akka处理当前在Future.traverse()中完成的工作,在具有所需SecurityManager的线程中运行的角色,而系统中的其他Actor,例如那些运行后台编译服务的角色,继续像现在一样运行,即不受限制?
发布于 2012-05-04 15:21:56
您可以构造一个ExecutionContext实例(例如。通过ExecutionContext.fromExecutorService)运行所有在限制性安全管理器下的工作,并将其引入到Future.apply和Future.traverse的隐式范围中。
如果调用的函数不需要与环境交互,我认为您不需要单独的ActorSystem。
https://stackoverflow.com/questions/10446903
复制相似问题