【问题标题】:wildfly have a ever running process run in the backgroundWildfly 在后台运行了一个不断运行的进程
【发布时间】: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 中的线程非常困难,因为它很难知道注入什么依赖项等

谁能告诉我如何解决这个问题?对此事的任何帮助都会令人惊叹。

【问题讨论】:

    标签: java java-ee-7 wildfly-8


    【解决方案1】:

    您遇到的问题与 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 或类似的支持“反应式”编程的项目。

    【讨论】:

    • 感谢 Alex 的详细回复,我将试探性地将服务器逻辑移出 ee 堆栈
    • >Java EE is not, however, designed for long running, thread-blocking background processes - 在 Java EE 中有 Java Batch,它就是这样做的。有关更多信息,请参阅这些链接javaee7.zeef.com/arjan.tijms#block_239
    • 谢谢,Arjan,我不知道这一点。
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2013-09-25
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多