Java: нужны эффективные уведомления между пользователями сайта - PullRequest
2 голосов
/ 15 июля 2009

У меня есть простая ajax-игра между двумя пользователями с Java-бэкэндом (tomcat, spring). Мне нужен какой-то хороший способ уведомления одного пользователя о том, что его оппонент сделал ход. Теперь все общение происходит через базу данных, и ожидание, пока противник закончит свой ход, выглядит следующим образом:

while(!timeout && !opponentIsDone) {
     //...get the game record from db and check if opponent made turn
     Thread.sleep(100);
}

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

Я не могу просто вызвать какой-то метод после того, как поворот сделан, потому что все это нужно, чтобы перейти в браузер через ajax, и я не могу отправить туда данные, только вытащить. Поэтому мне нужно иметь процесс, который ждет противника.

Я ищу легкое и простое решение.

Спасибо.

Ответы [ 7 ]

2 голосов
/ 15 июля 2009

Я думаю, что вы ищете шаблон распределенных событий (он же подписчик / издатель), и я считаю, что Dojo Framework его реализовал: http://ajaxpatterns.org/Distributed_Events

2 голосов
/ 15 июля 2009

Возможно, вы захотите взглянуть на расширенную поддержку Tomcat в IO (Comet).
http://tomcat.apache.org/tomcat-6.0-doc/aio.html

1 голос
/ 15 июля 2009

DWR (Direct Web Remoting) - это пакет, позволяющий сделать методы Java на сервере напрямую доступными для Javascript (путем создания прокси). Он имеет функцию «Обратный Ajax», которая является простым способом обработки push-сценариев.

1 голос
/ 15 июля 2009

flex / flash имеет систему чата в реальном времени (с использованием программирования удаленных объектов).

Вы должны установить BlazeDS (бесплатно) http://opensource.adobe.com/blazeds/, поставляется с примером приложения. Это называется технология AMF. Я думаю, что Spring так или иначе поддерживает этот AMF.

http://www.adobe.com/devnet/livecycle/articles/blazeds_spring.html http://blog.springsource.com/2008/12/17/using-spring-blazeds-integration-m1/

Это хорошо для Flash-сайта. Однако, если вы не хотите использовать flash, я думаю, вы можете скрыть или сделать его достаточно маленьким, просто чтобы использовать его в качестве канала связи на своей странице.

Возможно, вам нужно найти способ уведомить вашу веб-страницу / javascript после того, как Flash получит данные с сервера.

Да, я знаю, что этот метод немного хакерский, и это не чистый способ сделать что-то :) просто чтобы предоставить вам альтернативу.

1 голос
/ 15 июля 2009

Если у вас есть какой-то глобальный статический var, вы можете использовать java.util.concurrent.BlockingQueue

BlockingQueue handoff = new ArrayBlockingQueue (1);

// нить противника
handoff.offer (myTurn);

// другой поток может использовать
Turn otherTurn = handoff.poll (90, TimeUnit.SECONDS);

if (otherTurn == null)
// тогда нет поворота

Вы можете легко заставить людей ждать друг друга, используя SynchronousQueue вместо ArrayBlockingQueue.

и, конечно, он не должен быть глобальным статическим - это может быть что-то доступное для обоих пользователей.

1 голос
/ 15 июля 2009

Существует множество способов отправки уведомлений в веб-клиент. IM-клиент Gmail является отличным примером такого рода вещей. Это часто достигается путем удержания открытого HTTP-соединения каким-либо образом, и это семейство методов называется COMET. В Википедии есть статья, и есть блоги, посвященные этой теме (http://cometdaily.com/).

Даже если вы не использовали эту технику, вы все равно можете внести множество улучшений в алгоритм, который вы определили в своем вопросе. Одним из способов может быть использование шаблона ожидания / уведомления или подход подписчика / издателя. Другим вариантом будет немедленное возвращение страницы «в ожидании другого игрока», и эта страница будет автоматически обновляться каждые несколько секунд, пока другой игрок не выполнит свой ход.

Я думаю, что решение, которое вы ищете, это уведомление в стиле COMET.

0 голосов
/ 05 ноября 2009

Возможно, рассмотрите продолжение Jetty, если вы не привязаны к Tomcat?

http://bill.burkecentral.com/2008/11/12/buggybroken-tomcat-6-comet-nio-apis/ обсуждает Tomcat NIO

...