2011-02-04 57 views
1

在我們的Seam應用程序中,我們有一個輪詢部分,只要在瀏覽器窗口/選項卡中保持打開頁面,就可以保持對話處於活動狀態,以允許用戶可以同時處理多個對象實例,而不會在「不活動」頁面上的對話過期時在另一個對話框上忙碌。檢查是否正在使用Seam對話,但沒有鎖定

一切工作正常,但當輪詢線程發送請求而另一個(長時間運行)正在進行時,我們每時每刻都會遇到對會話異常的可怕併發調用。我們已經將併發請求超時值設置得相當高(20s),並且大部分時間頁面的返回時間不到2s。但是,在用戶處理大量數據(並且他們願意等待這些頁面加載,而不管需要多長時間)的情況下,因此就通用優化而言,我們無能爲力。

我們正在尋找的是一種方法來檢查(在中央過濾器中,所有請求都會經過),如果對給定對話存在鎖定,而沒有嘗試獲取一個對話(以便不觸發異常if已經有一個鎖)。我們有辦法區分我們是否正在處理這些後臺線程中的一個(我們爲會話管理做了這些工作,因此它們擴展了會話,但不是整個會話)。如果我們能夠識別出對話已被使用,那麼我們可以跳過對此輪詢線程的處理,因爲在特定的時間不需要它的服務(對話正在使用,所以沒有過期的危險)。


TLDR:檢查是否有一個Seam對話的鎖,但不嘗試訪問它(這可能導致觸發談吐異常併發調用)

任何指針,建議,是極大的讚賞。

+0

我知道有一種方法來排隊所有的請求,不知道如果這將是一個有效的方法給你。我現在不記得如何去做。 – Tiago 2011-02-04 16:01:08

回答

1

我假設你正在使用Seam2(因爲這個問題一直存在一段時間)。

有一個會話範圍類ConversationEntries,它使您可以訪問會話的所有會話。您可以通過致電getConversationEntries()

返回有關所有對話的信息,然後您可以調用每個ConversationEntrylockNoWait()方法獲取鎖定。當條目被另一個線程鎖定時,它將立即返回false。如果沒有其他線程持有鎖,它將返回true(在這種情況下,您將直接呼叫unlock())。

或者,您甚至可以撥打touch()而不打擾鎖,以避免會話過期。

此致敬禮, 亞歷山大。

相關問題