重新加载JVM进程保留Session

时间:2013-09-21 22:18:38

标签: java jvm

我正在开发java(SE)+一些开源库中的服务器应用程序。这是一款游戏,所以我认为它有时需要更新。只要应用程序跟踪客户端的状态,使用它,并且还支持客户端会话(以专用线程的形式),以及存储对这些播放器实例的引用的单例,我想重新加载JVM进程(例如,安装一个新版本的jar文件),这样一些类和实例不会被GC删除,而是挂钩到新进程中。

可能情况:

我在服务器上运行了游戏版本1.0。我需要在1.2中添加一些新功能。但是有100名球员互相争斗。我需要安装版本1.2,玩家可能会觉得有些滞后,但即使版本的jar已经改变,他们应该能够继续他们的战斗。

怎么办呢?

3 个答案:

答案 0 :(得分:2)

看看JRebel作者关于这个主题的精彩摘要:

http://zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/#!/

答案 1 :(得分:1)

你可以看看像OSGI和类加载技巧这样的东西,看看你是否能达到你所需要的,但也许有一种更简单的方法也更安全。

您可以在简单的负载均衡器后面运行2台服务器,当您需要进行此类维护时,您只需将所有新游戏路由到服务器A.当服务器B上的所有游戏完成(并且没有新游戏已经开始,因为所有游戏都将进入服务器A)时,您停止服务器B并执行任何维护以及任何测试以确认一切正常,然后再将其引入'集群'。

然后你做同样的事情并将新游戏路由到服务器B,这样当服务器A上的所有游戏完成后你也可以关闭它并进行维护。

您需要开发这个简单的负载均衡器,它只是作为连接路由器,但知道您的游戏会话。也许你还需要在每个服务器实例之间进行一些信息同步(如果需要在线传播玩家列表,聊天消息等等,取决于你拥有的功能)。

答案 2 :(得分:1)

首先要注意的是,您当前的游戏状态可能与新版本不一致。因此,并非所有修改都可以像这样安装。您可以使用具有主/从配置的远程缓存系统。这样所有会话都存储在远程计算机上,当一台服务器停止时,第二台服务器可以继续使用相同的状态。首先你放下奴隶,更新它并开始。然后切换角色并放下第二台服务器进行更新。