@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());
}
}
また、次のようなサーブレットにも:
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 は 1 つのアプリケーションにデプロイされ、サーブレットは別のアプリケーションにデプロイされます。
ドメイン全体でシングルトンが 1 つだけ作成されるため、シングルトン Bean が使用されるたびに、GlassFish ログに同じ Bean 名が含まれることが期待されます。代わりに、ログには、「シングルトン」Bean のインスタンスが少なくとも 2 つあることが示されています。
- 情報: サーブレットでは、totalBean は TotalBean@ 1b8e347 です。
- 情報: メッセージ駆動型 Bean では、totalBean は TotalBean@1b8e347 です。
- 情報: サーブレットでは、totalBean は TotalBean@1b8e347 です
- 情報: メッセージ駆動型 Bean では、totalBean は TotalBean@ 16ba6b2 です。
- 情報: サーブレットでは、totalBean は TotalBean@1b8e347 です
- 情報: メッセージ駆動型 Bean では、totalBean は TotalBean@1b8e347 です。
- 情報: サーブレットでは、totalBean は TotalBean@1b8e347 です
@Singleton EJB の理解の誤りを理解するのを手伝ってくれる人はいますか?
ありがとう!
-----スコット。