为什么我得到我的Singleton EJB的两个实例?

时间:2013-03-22 04:17:46

标签: java-ee java-ee-6

我正在做一些实验来帮助巩固我对@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部署在另一个应用程序中。

我的期望是每次使用单例bean时,我的GlassFish日志将包含相同的bean名称,因为我的整个域中只会创建一个单例。相反,日志表明我的“单例”bean至少有两个实例:

  • INFO:在servlet中,totalBean为TotalBean @ 1b8e347
  • INFO:在消息驱动的bean中,totalBean是TotalBean @ 1b8e347
  • INFO:在servlet中,totalBean是TotalBean @ 1b8e347
  • INFO:在消息驱动的bean中,totalBean是TotalBean @ 16ba6b2
  • INFO:在servlet中,totalBean是TotalBean @ 1b8e347
  • INFO:在消息驱动的bean中,totalBean是TotalBean @ 1b8e347
  • INFO:在servlet中,totalBean是TotalBean @ 1b8e347

有人能帮助我理解我对@Singleton EJB的理解错误吗?

谢谢!

-----斯科特。

1 个答案:

答案 0 :(得分:0)

你说你有两个应用程序,每个应用程序中的单例是不同的吗?

  

EJB和消息驱动的bean部署在一个应用程序中,而servlet部署在另一个应用程序中。

这是根据规范http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

  

单个会话bean 每个应用程序实例化一次,并且在应用程序的生命周期中存在。 Singleton会话bean设计用于客户端共享和同时访问单个企业bean实例的情况。