2009-07-15 51 views
2

我有一個簡單的ajax遊戲,有2個用戶使用java後端(tomcat,spring)。我需要一些很好的方式通知一個用戶他的對手轉了一圈。現在,所有的通訊都是通過數據庫完成,等待對手完成輪到他看起來是這樣的:Java:需要網站用戶之間的高效通知

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

我可以以某種方式擺脫這種循環睡眠(中)和不延遲後立刻通知(但超時) ?我大概可以做一些全局的靜態變量並通過它進行通信,但是我仍然需要類似的循環,只是可能超時會更小。

我不能只在調用完成後調用某個方法,因爲它都需要通過ajax去瀏覽器,我不能在那裏推送數據,只能拉。所以我需要有一個等待對手的過程。

我正在尋找一些簡單明瞭的解決方案。

謝謝。

+0

一些討論如果所有的通訊都是通過數據庫完成的,其數據庫系統,您可能是使用的想法告訴我們。 – 2009-07-15 01:21:49

+0

(雖然最好的答案可能會像使用JMS一樣) – 2009-07-15 01:23:06

+0

數據庫是mysql(通過休眠) – serg 2009-07-15 01:24:40

回答

1

有很多方法來推送通知到Web客戶。 Gmail的即時通訊客戶端就是這類事情的絕佳例子。這通常通過以某種方式持有開放的HTTP連接來完成,而這一系列技術被稱爲COMET。維基百科有一篇關於它的文章,並且有專門討論這個主題的博客(http://cometdaily.com/)。

即使您沒有使用這種技術,仍然可以對您在問題中確定的算法進行很多改進。一種方法是使用等待/通知排序模式或訂閱者/發佈者方法。另一種方法是立即返回「等待其他玩家轉彎」頁面,並且每隔幾秒自動刷新該頁面直到其他玩家輪到他。

不過,我認爲你要找的解決方案是COMET風格的通知。

1

如果你有某種形式的全球靜態無功,你可以使用一個java.util.concurrent.BlockingQueue中<牛逼>

的BlockingQueue <打開>切換=新ArrayBlockingQueue <打開>(1);

//對手線程
handoff.offer(myTurn);

//其他線程可以使用
打開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/

這是很好的基於Flash的網站。但是,如果您不想使用閃光燈,我認爲您可以隱藏它或使其足夠小,只是將其用作頁面上的通信頻道。

也許你必須找到一種方式來通知你的網頁/ JavaScript後,閃光燈從服務器接收數據。

是的,我知道這個方法有點怪異,它不是一個乾淨的做事的方法:)只是爲您提供替代方案。

1

DWR(Direct Web Remoting)是一個包,它允許您在服務器上直接提供Java方法(通過創建代理)。它有一個稱爲「反向Ajax」的功能,它是處理推送場景的簡單方法。