jakarta-ee - 为什么我会得到两个 Singleton EJB 实例?

标签 jakarta-ee java-ee-6

我正在做一些实验来帮助巩固我对 @Singleton EJB 的理解。

我已经实现了一个名为 TotalBean 的 EJB,如下所示:

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

我将它注入(inject)到消息驱动的 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 至少有两个实例:

  • 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
  • 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@1b8e347
  • 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
  • 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@16ba6b2
  • 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347
  • 信息:在消息驱动 Bean 中,totalBean 为 TotalBean@1b8e347
  • 信息:在 servlet 中,totalBean 为 TotalBean@1b8e347

任何人都可以帮助我理解我对 @Singleton EJB 的理解中的错误吗?

谢谢!

-----斯科特。

最佳答案

您是说您有两个应用程序,并且每个应用程序中的单例都不同?

The EJB and message-driven bean are deployed in one application, and the servlet in another application.

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

A singleton session bean is instantiated once per application and exists for the lifecycle of the application. Singleton session beans are designed for circumstances in which a single enterprise bean instance is shared across and concurrently accessed by clients.

关于jakarta-ee - 为什么我会得到两个 Singleton EJB 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562648/

相关文章:

jndi - Java EE 6嵌入式Glassfish嵌入式derby EJB单元测试

java - 最简单的 JSF 2.0 应用程序将无法运行

java - 在 Java 桌面应用程序中进行数据库访问的最佳方式

spring - 注释处理器异常

eclipse - 在 Eclipse 上使用 JPA 设置 Spring 3 MVC 项目

java - 我是否需要框架来补充 Java EE 6、JSF-2 Web 应用程序?哪个?

java - CDI - 事件观察者

java - WAR 文件外部的库依赖项

java - 如何使我的 Java/Java EE 应用程序的 IP 更安全?

java - 在我期望由变元设置的字符串的地方获取空值