2011-05-06 36 views
0

我在Servlet 3.0 API的幫助下爲我的網站實施了一個動態通知系統(la Facebook)。我支持這個功能的規劃的結構是:Java EE:在這種情況下讓我的上下文屬性線程安全是明智的嗎?

  1. 在每個頁面加載,發送XMLHTTP「得到」 請求到服務器
  2. 允許服務器創建AsyncContext從這些「得到」的要求和存儲對象 他們在用戶的網站ID鍵入一個應用程序範圍的地圖
  3. 每當用戶在產卵通知的動作 配合,查詢的 ID的用戶的朋友的 應用範圍的地圖,並使用將AsyncContext對象存儲在那裏,將 通知發送給每個朋友。
  4. 每位朋友收到 通知。

我的問題是:是否有必要使此地圖線程安全?在最壞的情況下,代表「通知發送用戶」行事的函數會將通知發送到映射中的陳舊異步上下文,或者是因爲用戶對應的是當前正在切換頁面並且尚未發送一個新的XMLHTTP請求,或已註銷。

但是,在每個頁面加載時,我也有代碼檢索數據庫中所有比「上次檢查日期」更新的通知,所以在頁面加載時,通知用戶不依賴動態通知系統。因此,如果用戶切換頁面,用戶仍然會收到通知(顯然,如果用戶註銷,則通知的概念不相關)。

鑑於此信息,是否有任何情況需要地圖是線程安全的?

回答

2

您可能不需要確切的一致性..但您仍然不希望任何線程正在寫入正常的哈希映射(正在寫入一個添加可能會導致重新刷新並將獲取的線程放入無限循環中)。

此外,這個計劃不會超過1臺服務器。如果那是OK ....只需使用ConcurrentHashMap。

+0

你能解釋爲什麼它不會使用ConcurrentHashMap來擴展1臺服務器嗎? – Kevin 2011-05-06 20:18:06

+0

它不會伸縮過去1臺服務器以將所有內容存儲在散列表中。你會想把它存儲在數據庫中,做一些事情或其他想法...... – bwawok 2011-05-06 21:56:22

+0

另一個問題/評論。上下文範圍的屬性不能在* in *上下文中更新;他們只能設置或檢索。 ConcurrentHashMap在這裏不是必需的,因爲每個用戶都會檢索映射的副本以讀取/插入數據,然後將其放回到同一個鍵下的上下文中。所以問題是我是否需要鎖定上下文;我錯誤地回答了原來的問題。你介意回答我最新的問題嗎? – Kevin 2011-05-07 00:49:54

相關問題