2015-02-09 27 views
0

我有兩個會話bean:併發關於無國籍豆

  • 無狀態會話bean稱爲AuctionFrontEnd。
  • 一個單獨的會話Bean稱爲StateAuctionFrontEnd

在StateAuctionFrontAnd有一個HashMap和認沽的方法和從HashMap中刪除元素。併發由@Lock(WRITE)和@Lock(WRITE)註釋處理。

AuctionFrontEnd Bean實現了調用StateAuctionFrontEnd中方法的業務邏輯方法。

在AuctionFrontAnd的實例方法是跟隨者(僞代碼):

如果還有誰想要消除同一元素兩個客戶,一個異常可以觸發。 兩者都調用刪除方法,並且都進來'如果'。 一個刪除元素,另一個啓動一個異常。

我在其他業務方法中遇到同樣的問題。

我該如何解決這個問題?

+1

使用併發數據結構? – Brendan 2015-02-09 19:03:12

回答

1

如果您獲得stateAuctionFronEnd.getHashMap(),則離開EJB的鎖定並同時修改地圖。

切換到併發數據結構將無濟於事,因爲if語句和delete都不在EJB的同步塊之外。

你應該完全移動邏輯來辛格爾頓豆和封裝訪問到HashMap中,如:

@Lock(WRITE) 
public void removeValue(int key){ 
    if(stateAuctionFronEnd.getHashMap().containsKey(key)) 
      stateAuctionFronEnd.getHashMap().remove(key); 
} 

另外,您也可以同步稱爲碼

+0

但請記住,當您使用手動同步時,應在單例類中使用'@ConcurrencyManagement(BEAN)'類型。 – slwk 2015-02-10 10:57:39

+0

這是一個解決方案!否則,如果我使用事務API來確保一系列操作的原子性? – 2015-02-10 12:00:02

+0

@slwk是的,但我的意思是無狀態bean中的手動同步。 使用事務應該工作並且會陷入「手動同步」類別,但要小心不要長時間鎖定 – 2015-02-10 17:27:39