2013-03-22 85 views
3

我正在做一些實驗來幫助鞏固我對@Singleton EJB的理解。爲什麼我得到我的Singleton EJB的兩個實例?

我已經實現了所謂的TotalBean這樣一個EJB:

@Singleton 
public class TotalBean implements TotalBeanLocal { 
    @Override 
    public String getName() { 
     return toString(); 
    } 
} 

我把它注入到這樣的消息驅動bean:

@MessageDriven(mappedName = "jms/TestQueue", activationConfig = { 
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
public class TotalMessageBean implements MessageListener { 

    @EJB 
    TotalBeanLocal totalBean; 

    @Override 
    public void onMessage(Message message) { 
     System.out.println("In message-driven bean, totalBean is " + totalBean.getName()); 
    } 
} 

而且還爲這樣一個Servlet:

public class TaxTest extends HttpServlet { 
    @EJB 
    TotalBeanLocal totalBean; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("In servlet, totalBean is " + totalBean.getName()); 
     // Display page, etc. 
    } 
} 

EJB和消息驅動Bean部署在一個應用程序中,並且servlet在另一個應用。

我的期望是,我的GlassFish日誌每次使用singleton bean時都會包含相同的bean名稱,因爲在我的整個域中只創建一個singleton。相反,雖然日誌表明有我的 「單身」 bean的至少兩個實例:

  • 信息:在servlet中,totalBean是TotalBean @1b8e347
  • 信息:在消息驅動bean,totalBean被totalBean @ 1b8e347
  • INFO:在小服務程序,totalBean是totalBean @ 1b8e347
  • INFO:在消息驅動bean,totalBean是totalBean @16ba6b2
  • INFO:在小服務程序,totalBean是totalBean @ 1B 8e347
  • 信息:在消息驅動bean,totalBean是TotalBean @ 1b8e347
  • 信息:在servlet中,totalBean是TotalBean @ 1b8e347

任何人可以幫助我理解錯我的@Singleton EJB的理解?

謝謝!

-----斯科特。

+0

如果你設置了一些實例變量,我認爲它們應該相同。我猜你看到的2個實例只是一些pproxy – 2013-03-23 08:49:19

+0

實例變量也不同;這就是我注意到這個問題的方式。我認爲從對象內返回名稱將返回對象本身的名稱,而不是其中一個代理。 – sgifford 2013-03-23 13:47:37

回答

0

你說你有兩個應用程序,並且每個應用程序中的單例不同?

EJB和消息驅動Bean部署在一個應用程序中,而servlet部署在另一個應用程序中。

這是依據規範http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

一個單會話bean 每個應用程序實例化一次和存在的應用程序的生命週期。 Singleton會話Bean是爲單個企業bean實例在客戶端之間共享和併發訪問的環境而設計的。

+0

感謝您的關注。你可以從我發佈的日誌中看到,雖然單例實例最初在兩個應用程序中都是相同的,但稍後更改只是消息驅動的應用程序。 – sgifford 2015-07-02 04:37:38

相關問題