我正在制作一个 html5/js 游戏,它将为我的后端提供在线功能,我决定使用 Wildfly 服务器。客户端将通过 Web 套接字与服务器通信。
我打算让我的 Wildfly 服务器也负责游戏逻辑决策,例如移动 npc。我的计划是有一个 @startup bean 来运行服务器游戏循环来处理这个逻辑。然后,服务器循环将通过 HornetQ 与 serverEndPoint 通信。我的 serverEndPoint 和服务器循环如下所示:
服务器端点
@ServerEndpoint(value= "/game/{user-id}")
public class GameEndpoint {
@Inject
GameManager gameState;
GameWorld gameWorld;
Player p;
private Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void onOpen(Session session){
//do stuff
}
@OnMessage
public void onMessage(Session session, String message){
//do stuff
}
@OnClose
public void onClose(CloseReason reason){
//do stuff
}
@OnError
public void error(Throwable t){
//do stuff
}
}
游戏世界
@Startup
@Singleton
public class GameWorld {
@Inject
GameManager gameState;
private Logger logger = Logger.getLogger(this.getClass().getName());
@PostConstruct
public void init(){
gameloop();
}
private void gameloop(){
while(true){
logger.info("This is a test!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@PreDestroy
public void terminate(){
//do stuff
}
}
这个问题是服务器循环卡住了所有内容,因为它是一个无限循环(例如,如果我尝试访问 html 网页,我会得到 404)。显然,如果 serverLoop 位于其自己的单独线程上,则可以解决此问题,但经过一些研究后,jboss 中的线程似乎非常困难,因为很难知道要注入(inject)哪些依赖项
谁能告诉我如何解决这个问题?对此事的任何帮助都会很棒。
最佳答案
您遇到的情况与 Java EE 是什么和不是什么有关:Java EE 针对处理许多并发的短期请求进行了优化,每个请求(通常)处理一个事务。容器在这方面做得非常好,特别是对于无状态 bean,而且对于有状态 bean(集群复制等)也是如此。因此,Java EE 可能非常适合处理来自 HTML5/JS 客户端的请求,并将请求提供给消息传递基础设施。然而,Java EE 并不是为像您这样的长时间运行、线程阻塞的后台进程而设计的。
FWIW:您尚未遇到的另一个问题是,即使您可以修复该问题:接下来您将在 @PostConstruct 方法上遇到事务超时。
我认为您最好将游戏引擎移出 Java EE 堆栈。您已经提到您计划使用 HornetQ - 那么为什么不将游戏引擎放在一个简单的独立应用程序中,该应用程序接收来自 HornetQ 的消息并将回复反馈给 HornetQ。
另一个选择可能是专用的 Java 游戏服务器引擎,例如,参见 this question及其在programmers.stackoverflow.com上接受的答案。 (更新:该答案中提到的“RedDwarf Server”项目似乎已于 3 年前停止)。
如果你绝对想使用Java EE环境,我建议你使用TimerService反而。但请注意,这还要求您的游戏循环计算快速并保证在安排下一次超时之前完成,否则容器将跳过计划的调用(带有“仍在运行”消息或类似消息)。
最后,让我提一下,如果我今天要启动一个新的游戏服务器,我肯定会看一下Akka 、Node.js 或支持“响应式(Reactive)”编程的类似项目。
关于java - Wildfly 有一个在后台运行的持续运行的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710883/