2009-12-03 96 views
2

場景:基於Apache Wicket的Web應用程序在Tomcat服務器上運行。Wicket:如何同步會話中的請求

用戶在瀏覽器中打開URL,創建會話並在瀏覽器中顯示簡單的主頁面,用戶點擊按鈕並調用AJAX調用。應用程序獲取請求並做一些準備響應的東西。在同一時間,瀏覽器中的用戶或JavaScript調用另一個AJAX調用 - 第二個請求在應用程序中的另一個線程中處理,並且因爲應用程序的大部分部分都是會話特定的並且不是線程安全的(因爲一個用戶=一個會話),異常拋出

可能的解決方案:

  1. 使所有應用程序類線程安全的(非常昂貴)

  2. 適應GUI所以沒有同時運行兩個AJAX在一個會話(瀏覽器GUI的不可能的,因爲性要求)

  3. 同步在一個會議上檢票或Tomcat水平(但怎麼所有的請求?)

  4. 另一種做法或技巧?

感謝

回答

4

請求到相同頁映射內的頁面或組件中 一個會話已經同步 - 在同一時間只有一個線程。像 圖像,JavaScript,CSS文件等資源的請求異步處理。 (不同的客戶端 不會因爲每個客戶端都有自己的會話和PageMap而彼此阻塞)。

但是,我相信在會話中訪問項目本身並沒有明確的同步。順便說一句,從不是請求線程的線程訪問會話/頁面並不是一個好主意,因爲容器可以在請求之間自由地處理會話/頁面 - 例如,寫出來的磁盤等

+0

正如你所提到的,最終它是從處理請求的線程和另一個在另一個先前處理的請求中被觸發的線程併發訪問的。 Wicket(我相信)真正同步來自同一頁面的請求。謝謝。 – mschayna 2009-12-09 12:42:06

3

什麼是例外拋出?如果拋出一個異常,那麼我會認爲Session對象中有一個關鍵部分需要同步或處理,並且可能不是整個會話。

我還沒有理由利用它們,但我知道有一些渠道作爲wicket-ajax.js(位於org.apache.wicket.ajax包中)的一部分。這些控制如何處理多個AJAX調用。他們可能值得一看。在這個文件是以下注釋:

/** 
* Channel management 
* 
* Wicket Ajax requests are organized in channels. A channel maintain the order of 
* requests and determines, what should happen when a request is fired while another 
* one is being processed. The default behavior (stack) puts the all subsequent requests 
* in a queue, while the drop behavior limits queue size to one, so only the most 
* recent of subsequent requests is executed. 
* The name of channel determines the policy. E.g. channel with name foochannel|s is 
* a stack channel, while barchannel|d is a drop channel. 
* 
* The Channel class is supposed to be used through the ChannelManager. 
*/ 
+0

我認爲特定的異常是無關緊要的,實際上它是ConcurrentModificationException。更重要的是,設計中不是線程安全的代碼被兩個線程同時調用。我想優先在Wicket層面阻止。我不想更改所有的應用程序邏輯。 – mschayna 2009-12-03 15:22:24

+0

您是否修改相同的數據?我知道在我們的應用程序中,我們已經竭盡全力利用Wicket的模型對象,而不是將事情放在會話中。我們在會議中有一些東西,但不是很多。 – Matt 2009-12-04 16:53:24

+0

最後:它是從處理請求的線程和在另一個先前處理的請求中觸發的另一個線程併發訪問的。Wicket(我相信)真正同步來自同一頁面的請求。謝謝。 – mschayna 2009-12-09 12:39:03