2015-10-26 53 views
0

我對這裏發生的事情感到不知所措。我有一個包含列表的單身bean。當我將項目添加到列表中時,內容始終保持一致。但是,當我從另一個服務調用get列表時,它將返回一個具有不同java id的空列表。不知怎的,單身bean根據誰在調用,有兩個不同的包含列表實例。創建列表的多個實例的Java Singleton bean

這裏是類是如何定義的:

@Startup 
@LocalBean 
@DependsOn({ "classnameremoved" }) 
@Dependent 
@Singleton 
public class SomeManager 
{ 
    private List<someType> aList = new ArrayList<someType>(); 

    public List<someType> getListData() 
    { 
     List<someType> returnList = new ArrayList<someType>(); 
     synchronized (aList) 
     { 
      returnList.addAll(aList); 
     } 

     return returnList; 
    } 

    public void handleCreatedEvent(Data someData) 
    { 
     synchronized (aList) 
     { 
      aList.add(someData); 
     } 
    } 
} 

兩者之間的區別是這樣的:

add方法是從偵聽新的消息,並調用相應的處理程序一個bean調用。 get是從事後處理數據的另一個bean調用的。當我從這兩個接一個打電話時,該列表具有不同的ID並且不是同一個對象。我無法弄清楚這是怎麼回事。

在這兩種豆類我有類以上包含以下行:

@EJB 
private SomeManager someManager; 

其他兩個類具有以下注釋:

該類總是在列表中選擇合適的數據,是沒有通過重複測試清除。

@Singleton 
@Startup 
@LocalBean 
@DependsOn("some class") 
public class MessageListener ... 

該類總是得到一個空列表回

@Stateless 
@LocalBean 
@javax.ejb.TransactionManagement(javax.ejb.TransactionManagementType.BEAN) 
public class GetClass ... 

任何提示,以正在發生的事情是非常讚賞。這全部在一臺本地機器上。

+0

如果在類名或註釋請忽略任何錯別字。這不是複製和粘貼代碼,因爲這不是我可以分享的內容。這只是類如何定義的複製品。 – JeremyK

回答

1
+0

從我一直在閱讀中,我假設我的問題是「同時裝載不同類加載器的多個單例」。我找不到任何資源來解決它,所以只創建一個實例。 – JeremyK

+0

我想在這裏添加單身bean需要在靜態上下文中調用,以便剛好創建一個實例。我沒有看到你的情況發生。 – user3307291

+0

也有可能會加載多個單例,但上下文必須有所不同 – user3307291