java - Wildfly 有一个在后台运行的持续运行的进程

标签 java java-ee-7 wildfly-8

我正在制作一个 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/

相关文章:

java - 将 Apache Pig 连接到 Hadoop 集群

java - 如何将bean作为后台服务运行?

java - 依赖注入(inject)和容器类 (java-ee 7)

intellij-idea - IntelliJ & Wildfly - 热部署 webapp

java - 从原始字符串数据创建图像文件

java - 使用扫描仪的分隔符功能来查找 "abc-def"

java-ee-7 - Arquillian 配置 DeploymentException 和 WindowBeanHolder

wildfly - 我如何在端口 80 运行 Wildfly 8

java - 增加 WildFly 中的 JTA 事务超时限制

java - 使用 hibernate 5.0.2 和 glassfish4.0