2014-07-14 67 views
0

我寫的jboss-AS-7的應用程序服務器上的Java EE 6的應用程序。我想要一個「Singleton Session Bean」來將應用程序範圍信息存儲在列表「mediaDataList」中。「辛格爾頓會話Bean」存儲應用廣泛信息的Java EE 6

一個statless會話Bean「ClassA的」寫一些對象清單和web服務的「mediaDataList」列表讀取信息。

@Singleton 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
@Lock(LockType.WRITE) 
public class MediaDataSafe { 

    private final List<MediaData> mediaDataList = new ArrayList<MediaData>(); 

    @Inject 
    Logger log; 

    @PostConstruct 
    void init() { 
     // read from HD and store in mediaDataList 
    } 


    // just read the list... 
    public List<MediaData> getMediaDataList() { 
     return mediaDataList; 
    } 

    // write to list 
    public void writeMediaDataSafe(...) { 
     mediaDataList.add(auraMediaData); 
    } 
} 


@Stateless 
public class ClassA { 

    @Inject 
    MediaDataSafe mediaDataSafe; 

    //write in list of singleton 
    public void write(...) { 
     mediaDataSafe.writeMediaDataSafe(...); 
    } 
} 

@WebService(serviceName = "MyWebService", endpointInterface = "com.WebService") 
public class MyWebService implements com.bla.WebService { 

    //... 

    @Inject 
    transient MediaDataSafe mediaDataSafe; 

    //read from list in singleton 
    public MediaList getMediaList(...){ 
     mediaDataSafe.getMediaDataList(...); 
    } 
} 

我的問題是,似乎在我的系統中存在兩個「signleton bean」!如果「ClassA」向列表中寫入一些新值,則無法使用web服務讀取這些新值。 Web服務始終返回相同的列表。 (它包含了初始化狀態!)

什麼我錯了嗎?我在這裏誤解「Singleton Session Bean」嗎?

+0

根據應用程序的具體情況,你可能想看看插入到應用程序作用域bean中,而不是嘗試使會話bean應用程序作用域。應用程序範圍Bean被標記在您的描述符文件中,並且服務器上只會存在一個。 –

+0

是的,我知道應用程序範圍的bean是如何工作的。但是,我想要的是,在我的業務層上處理這個不在web層上...因此我更喜歡單身人士。但是,爲什麼不工作....? – Gatschet

回答

0

它看起來不錯,到目前爲止對我來說,因爲一個Singleton每個應用程序實例化一次,我能想到的可能導致所描述的行爲的唯一原因,是一些在同一個應用程序的多個部署的方向。

也許它有助於仔細閱讀Java EE 6 tutorial以下部位來發現問題:

+0

其實我可能有幾個部署。我有一個業務層(包含我的單身人士),它由一個Web層(用於管理控制檯)和一個通信層(webservice)使用。我不明白的是,我的寫作和閱讀清單都是通過web服務來完成的。在這種情況下,我的web服務應該仍然只存在一個單身人士? – Gatschet

+0

我忘了寫的是,列表中的文字是通過消息驅動bean實現的。這是否有一些奇怪的影響? – Gatschet

+0

@Gatschet如果真的有一個以上的實例,或者如果它被以某種方式重新初始化,您可以通過設置斷點檢查或添加記錄檢查的對象ID,如果它通過構造函數運行兩次。除此之外,哪個組件調用你的Singleton並不重要,它應該只存在一次。 –