4

我正在做一些实验来帮助巩固我对@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 至少有两个实例:

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

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

谢谢!

-----斯科特。

4

1 回答 1

0

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

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

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

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

于 2015-05-23T16:20:33.463 回答