【发布时间】:2014-09-07 13:48:13
【问题描述】:
我正在制作一个 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 中的线程非常困难,因为它很难知道注入什么依赖项等
谁能告诉我如何解决这个问题?对此事的任何帮助都会令人惊叹。
【问题讨论】: