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());
    }
}

また、次のようなサーブレットにも:

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 の理解の誤りを理解するのを手伝ってくれる人はいますか?

ありがとう!

-----スコット。

4

1 に答える 1

0

2 つのアプリケーションがあり、アプリケーションごとにシングルトンが異なるということですか?

EJB とメッセージ駆動型 Bean は 1 つのアプリケーションにデプロイされ、サーブレットは別のアプリケーションにデプロイされます。

これは仕様http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.htmlによると:

シングルトン セッション Beanは、アプリケーションごとに 1 回インスタンス化され、アプリケーションのライフサイクルの間存在します。シングルトン セッション Bean は、単一のエンタープライズ Bean インスタンスがクライアント間で共有され、クライアントによって同時にアクセスされる状況向けに設計されています。

于 2015-05-23T16:20:33.463 に答える