2014-09-07 4 views
2

Я создаю игру html5/js, которая будет иметь возможности онлайн для моего бэкэнда. Я решил использовать сервер wildfly. Клиент будет связываться с сервером через веб-сокеты.wildfly всегда работает в фоновом режиме

Я предназначил для моего сервера wildfly также отвечать за решения логической логики, такие как перемещение npc. Мой план состоял в том, чтобы иметь компонент @startup, который будет запускать петлю серверной игры для обработки этой логики. Затем цикл сервера будет разговаривать с serverEndPoint через 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 
    } 
} 

GameWorld

@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 очень сложна, так как трудно понять, какие зависимости нужно вводить и т. д.

Может ли кто-нибудь пролить свет на то, как я могу решить эту проблему? любая помощь по этому вопросу была бы потрясающей.

ответ

2

Что вы столкнулись с тем, что такое Java EE, а что нет: Java EE оптимизирован для обработки многих параллельных, недолговечных запросов, каждый из которых (обычно) обрабатывает одну транзакцию. Контейнеры делают это очень хорошо, особенно с фазами без состояния, но также с фазами с сохранением состояния (репликация кластера и т. Д.). Таким образом, Java EE может быть хорошо подходит для обработки запросов, поступающих от ваших клиентов HTML5/JS, и подачи запросов в инфраструктуру обмена сообщениями. Однако Java EE не предназначен для длительных, поточно-блокирующих фоновых процессов, таких как ваши.

FWIW: Еще одна проблема, с которой вы еще не столкнулись, даже если вы можете ее исправить: Затем вы столкнетесь с таймаутом транзакции в методе @PostConstruct.

Я думаю, что вам лучше перемещать игровой движок из стека Java EE. Вы уже упоминали, что планируете использовать HornetQ - тогда почему бы не поставить игровой движок в простое автономное приложение, которое получает сообщения от HornetQ и ответы на фиды возвращаются в HornetQ.

Другим вариантом может быть выделенный движок игрового сервера Java, см., Например, this question и его принятый ответ на programers.stackoverflow.com. (Обновление: похоже, проект «RedDwarf Server», упомянутый в этом ответе, был прекращен 3 года назад).

Если вы абсолютно хотите использовать среду Java EE, я предлагаю вместо этого использовать TimerService. Обратите внимание, однако, что это также требует, чтобы ваш расчет игрового цикла был быстрым и гарантированно заканчивался до тех пор, пока не будет запланирован следующий таймаут, иначе контейнер пропустит запланированный вызов (с сообщением «все еще работает» или аналогичным).

Наконец, позвольте мне сказать, что если бы я сегодня начал новый игровой сервер, я бы определенно взглянул на Akka, Node.js или подобные проекты, которые поддерживают «реактивное» программирование.

+0

спасибо за подробный ответ Alex I я буду проворно перемещать логику сервера из ee-стека – zidsal

+2

> «Java EE, однако, не предназначен для длительных, поточно-блокирующих фоновых процессов». В Java EE есть Java Batch для этого, что делает именно это. См. Эти ссылки для получения дополнительной информации https://javaee7.zeef.com/arjan.tijms # block_239 –

+2

Спасибо, Арьян, я не знал об этом. –

Смежные вопросы