2009-07-15 3 views
2

Java 백엔드 (바람둥이, 봄)를 사용하는 2 명의 사용자 사이에 간단한 아약스 게임이 있습니다. 한 사용자에게 상대방이 차례를 보낸 사실을 알리는 좋은 방법이 필요합니다. 이제 모든 통신이 데이터베이스를 통해 수행하고 자신의 차례를 완료 상대를 기다리는 것은 다음과 같습니다된다Java : 사이트 사용자 간의 효율적인 알림이 필요합니다.

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

내가 어떻게 든 잠 (이 루프 제거 가능) 및 즉시 지체없이 통지받을 (그러나 타임 아웃) ? 아마도 일부 글로벌 정적 var 만들고 그것을 통해 통신 할 수 있지만 여전히 비슷한 루프가 필요합니다 어쩌면 제한 시간이 더 작을 것입니다.

아약스를 통해 브라우저로 갈 필요가 있고 데이터를 가져올 수 없기 때문에 차례가 완료되면 일부 메소드를 호출 할 수 없습니다. 그래서 상대방을 기다리는 과정이 필요합니다.

나는 가볍고 간단한 해결책을 찾고 있습니다.

감사합니다.

+0

에 대한 몇 가지 논의가있다. –

+0

(가장 좋은 대답은 아마도 JMS를 사용하는 것과 비슷할 것이다.) –

+0

데이터베이스는 mysql (최대 절전 모드) – serg

답변

2

Tomcat의 고급 IO (Comet) 지원을 살펴볼 수 있습니다.
http://tomcat.apache.org/tomcat-6.0-doc/aio.html

+0

감사합니다. 그것에 대해 읽었지 만 잔인한 것처럼 보입니다 ... 나는 가능한 한 단순한 것을 선호합니다. – serg

+1

Tomcat 6 이전에는 필자 고유의 알림 시스템을 사용했습니다. 결코 간단하지는 않았습니다. 그것의 힘든 문제 때문에 http의 무국적자 자연. – Jataro

2

난 당신이 분산 이벤트 (일명 가입자/게시자) 패턴을 찾고 생각하고, 나는 도조 프레임 워크를 구현했다고 생각 : http://ajaxpatterns.org/Distributed_Events

+0

그 기사를 올바르게 이해했다면 데이터베이스 기록을 확인하는 대신에 광산과 비슷한 루프를 사용합니다. 이벤트를 확인하고 있습니다. 정적 변수만으로도 동일한 작업을 수행 할 수 있습니다. – serg

+0

차가움. 당신이 만족한다면이 질문에 대한 답을 고맙게 생각할 것입니다. – gravyface

1

웹에 푸시 알림을하는 방법에는 여러 가지가 있습니다 고객. Gmail의 IM 클라이언트는 이런 종류의 훌륭한 예입니다. 이것은 종종 어떤 방식 으로든 열린 HTTP 연결을 유지함으로써 이루어지며,이 기술 군을 COMET이라고합니다. 위키 피 디아 (Wikipedia)에 기사가 있으며 주제에 대한 블로그 (http://cometdaily.com/)가 있습니다.

이 기술을 사용하지 않았더라도 질문에서 식별 한 알고리즘을 개선 할 수 있습니다. 한 가지 방법은 대기/알림 유형의 패턴이나 구독자/게시자 방식을 사용하는 것입니다. 또 다른 플레이어는 "다른 플레이어가 차례를 기다리는 중"페이지를 즉시 반환하고 다른 플레이어가 자신의 차례를 할 때까지 해당 페이지를 자동으로 새로 고칠 수 있습니다.

당신이 찾고있는 해결책은 COMET 스타일의 알림이라고 생각합니다.

+0

글쎄, 나는 벌써 혜성 접근법을 사용하고 있으므로 상대방을 기다리는 동안 공개 된 HTTP 연결을 가지고있다. (위키에서 그들은 긴 폴링으로 Ajax라고 부른다.) 저의 유일한 관심사는 수면을 제거하고 즉각적인 통보를 받고 싶다는 것입니다. 두 번째 단락의 모든 접근법은 이미 가지고있는 루프 기술에서 기본적으로 동일한 대기를 사용합니다. – serg

1

당신이 어떤 종류의 글로벌 정적 VAR이 있다면, 당신은 > 핸드 오프 = 새로운 ArrayBlockingQueue 등이 >을 돌려 < 돌려 < java.util.concurrent.BlockingQueue <T>

BlockingQueue를 사용할 수 (1);

// 상대 스레드
handoff.offer (myTurn);

// 다른 스레드가 사용할 수 있습니다
turn otherTurn = handoff.poll (90, TimeUnit.SECONDS);

은 (otherTurn == null가)
// 다음 어떤 차례 당신은 쉽게 사람들이 대신에 ArrayBlockingQueue의에 SynchronousQueue를 사용하여 서로를 기다릴 수

을하지합니다.

물론 글로벌 정적 일 필요는 없습니다. 두 사용자가 액세스 할 수있는 모든 것일 수 있습니다.

1

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/

그것은 플래시 기반의 웹 사이트에 대한 좋은

. 그러나 플래시를 사용하고 싶지 않다면 페이지의 통신 ​​채널로 사용하기 위해 플래시를 숨기거나 작게 만들 수 있다고 생각합니다.

아마도 플래시가 서버에서 데이터를 수신 한 후 웹 페이지/자바 스크립트에 알리는 방법을 찾아야 할 것입니다.

그래, 나는이 방법이 약간 해키라는 것을 알고 있으며, 일을하기위한 깨끗한 방법이 아니라 단지 대안을 제공하기위한 것이다.

1

DWR (직접 웹 리모팅)은 프록시에서 작성하여 Javascript에서 직접 사용할 수있는 Java 메소드를 서버에서 사용할 수있게 해주는 패키지입니다. 푸시 시나리오를 처리하는 쉬운 방법 인 "Reverse Ajax"라는 기능이 있습니다.

관련 문제