0

我正在研究一個嚴重依賴主用戶頁面上的ajax請求的項目。Play Framework 1.2.4在異步線程中同步作業:可能嗎?

在當前網頁中,我有一個「n」個相同的視圖,每個視圖都有一個Ajax請求。所以當使用加載頁面時,有「n」個Ajax請求同時運行。

還有另一個設計問題,在第一個請求運行後,其他請求將從該緩存收集數據。繼承人的工作流程:

請求:

  1. 發送請求
  2. 檢查緩存具有所需的值
  3. 如果沒有可用的,然後收集來自網絡服務器的數據( 需要一些時間)
  4. 收集數據,將「x」分鐘的值寫入緩存。
  5. 返回值 。

因此,如果我可以設法在開始時只運行一個請求,並讓其他請求等待第一個請求完成,它們將能夠使用緩存中可用的數據,並且會大大提高性能。

的問題是遊戲運行的所有作業異步事件使這些請求不會在第一個頁面加載看到一個緩存值..

所以我需要做的是這樣的:

----Main ASYNC Thread------ 
-------first View Request---- 
-------second Request (it will run after the first one so it will read from the cache--- 
----- and so on... 

所以,如何將請求放入隊列中,或者如何讓其他請求「等待」是可能的?

我知道我應該設計這個應用程序,但頁面設計和JavaScript設計來自外部來源。所以我沒有時間對這些事情工作..

感謝您的幫助..

回答

0

如果你在一個方法封裝數據加載邏輯,你可以同步在該方法中的所有線程,例如。使用AtomicBoolean標誌。

private final AtomicBoolean initialised = new AtomicBoolean(false); 

public Data getData() { 
    Data data = null; 
    if (!initialised.get() && initialised.compareAndSet(false, true)) { 
    cache.put(loadData()); 
    } 
    while ((data = cache.get()) == null); 
    return data; 
} 

只是其中的一種方法。

+0

我已經通過兩種方法解決了這個問題,首先我意識到有一種叫做jquery.queue的東西,所以我能夠排隊ajax請求,然後我將邏輯改變爲計算和緩存所需第一個請求中的值和其他值只是查看緩存的值。 (如果找不到「查找緩存」,如果找不到「查找數據庫」「執行計算」),首先緩存隊列,其他緩存從緩存中獲取數據。 – dreampowder 2012-04-16 14:52:57

+0

BTW AtomicBoolean就在我的知識水平之上,感謝分享這個信息,我接受你的答案,因爲我也以某種方式封裝了數據加載邏輯,就像你說的一樣。謝謝 – dreampowder 2012-04-16 14:53:17

+1

Np。但是,如果緩存的數據是在多個用戶/會話之間共享的,或者說,類似的請求是從瀏覽器中的兩個不同的選項卡發送的(在這種情況下,會話是相同的),但您仍然會遇到最初的問題。這是因爲會爲每個加載的頁面創建多個jqery隊列。因此,服務器端的一些同步機制對解決您的問題可能至關重要。 – Vlad 2012-04-16 16:30:23