2011-05-23 121 views
0

我有以下代碼:辛格爾頓與JBoss SEAM

@Name("myService") 
@Scope(ScopeType.APPLICATION) 
@Stateless 
public class MyService { 
    private Service service; 

    private Service getService() { 
    if (service == null) { 
     service = Service.create(url, new QName("URL", 
     "Envelope")); 
    } 

    return service; 
    }  

    public synchronized Port getPort() { 
    return getService().getPort(); 
    } 
} 

而getPort方法從不同的線程調用。 「Service.create」需要很多時間,我發現它實際上被調用了多次。所以它看起來像創建MyService類的多個實例,這就是爲什麼同步沒有幫助。

我已經改變註釋:

@AutoCreate 
@Startup 
@Name("myService") 
@Scope(ScopeType.APPLICATION) 

而現在它似乎很好地工作:只創建一個實例,並訪問的getPort()方法是同步的。

任何人都可以解釋爲什麼第一個案件不符合預期?綁定到一個應用範圍

回答

4

一個@Stateless是一個矛盾

你所要求的Java EE提供一個沒有狀態,生活在一個應用範圍的組成部分,由所有用戶共享

當你刪除@Stateless註釋,縫處理組件的實例並將其放置在應用程序範圍中,它也在啓動時創建它,因此具有單例