2015-06-05 36 views
1

在我們的生產系統中,我們遇到了jboss 8.2和最新的JDK 7,centos 7 64位以及javax.enterprise.context上的最新primefaces中的一個非常奇怪的問題。 SessionScoped beans。 (在整個項目中沒有使用jsf註釋,只有CDI註釋才能避免潛在衝突)Wildfly 8.2 + JSF + SessionScoped:有時會返回錯誤的數據

在某個時間點(我們不知道是什麼觸發它)在處理一個請求期間@SessionScoped bean給出了矛盾信息。然而,處理總是隻發生在一個會話和一個線程中。

下面是日誌行(簡化的例子),當請求的處理是正常(這裏兩個連續請求):

15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step1 : login : "UserA"; 
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step2 : login : "UserA"; 
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step3 : login : "UserA"; 
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step4 : login : "UserA"; 
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step5 : login : "UserA"; 
15:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step6 : login : "UserA"; 
15:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step7 : login : "UserA"; 

15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step1 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step2 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step3 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step4 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step5 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step6 : login : "UserB"; 
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step7 : login : "UserB"; 

下面是當請求的處理「損壞」日誌線(雙連續的請求)。留意登錄值:

16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step1 : login : "UserA"; 
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step2 : login : "UserB"; 
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step3 : login : "UserB"; 
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step4 : login : "UserA"; 
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step5 : login : "UserB"; 
16:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step6 : login : "UserB"; 
16:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step7 : login : "UserA"; 

16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step1 : login : "UserB"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step2 : login : "UserX"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step3 : login : "UserX"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step4 : login : "UserB"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step5 : login : "UserX"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step6 : login : "UserX"; 
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step7 : login : "UserB"; 

在很長一段時間(一般5-10小時)一切正常,然後發生的東西(?時間/線程耗盡/厄運/ ....不知道),然後webapp是「破」的。當它被破壞時,如上所述的數據不匹配是頻繁但不繫統的。

唯一的解決辦法是重啓野蠅。

在'已損壞'狀態下,只有一個用戶掛起http會話(沒有http會話斷開/連接),並且只有連續的網頁按鈕點擊,才能觀察到這種錯誤行爲。關鍵是,我確信,當服務器「損壞」時,只有一名用戶和沒有負載的情況下才能重現該錯誤。

提示:OurWeirdSessionScopedBean是託管我們的xhtml頁面的managedBean,並且在涉及處理的其他CDI bean中注入(CDI @Inject)。

看來,如果在其他CDI bean中注入OurWeirdSessionScopedBean的代理並不總是引用與xhtml頁面的backingBean相同的數據。但它應該是同一個對象。 OurWeirdSessionScopedBean註釋爲@SessionScoped和@Named。

有沒有人遇到過這樣的行爲?有人有解釋/解決方案或解決方法嗎?

非常感謝

+0

要清楚,你說了錯誤的會話bean被注入?會話ID實際上是否改變。例如用((HttpSession)FacesContext.getCurrentInstance()。getExternalContext()。getSession(false)).getId())'記錄它。 – DavidS

+0

對於給定的請求,會話ID不會更改。我們做了日誌會話ID(我在這裏忽略了它)。對於需求1的每個日誌行,會話Id與需求1一致,且不會更改。其他請求也一樣。 但會話作用域bean返回的數據不一致,並且因任何原因而發生更改。 – NodeNoob

回答

相關問題