4

統計のない Bean がある場合は、@EJB アノテーションによってサーブレットに注入できます。例えば:

@Stateless
public class LongTimeService {  
    public void do() {
        //logic
    }
}

public class ServletWithBean extends HttpServlet {  
    @EJB
    private LongTimeService bean;

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
        throws ServletException, IOException {
             bean.do;
             ...
    }
}

この場合、サーブレットのライフサイクル全体で、LongTimeService Bean のインスタンスは 1 つだけになります。ejb コンテナーの観点から見ると、Web コンテナーが Bean を使用してサーブレットを構築する場合、ejb コンテナーからインスタンスを要求し、サーブレットが破棄され、すべてのサーブレット要求が 1 つのインスタンスでのみ機能するまで、このインスタンスを保持します。Statless EJB はそのような使用法を作成しないため、これは悪い使用方法だと思います。たとえば、この perpes には、便利な @Singleton statfull Bean があります。しかし、統計のない Bean を使用したい場合は、メソッド内で毎回 Context からこの Bean のインスタンスを検索できます。

public class ServletWithBean extends HttpServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
        throws ServletException, IOException {
        Context ctx = new InitialContext();
        LongTimeService bean =  context.lookup("LongTimeService");
             bean.do;
             ...
    }
}

このアプローチを使用することは正しく、可能ですか?

4

1 に答える 1

4

ejb コンテナーの観点から見ると、Web コンテナーが Bean を使用してサーブレットを構築する場合、ejb コンテナーからインスタンスを要求し、サーブレットが破棄されてすべてのサーブレット要求が 1 つのインスタンスでのみ機能するまで、このインスタンスを保持します。

あなたの推論は正しいですが、サーブレット クラス メンバーに注入されるインスタンスは、実際にはスタブまたはプロキシと呼ばれるオブジェクトのインスタンスであり、実際には EJB インスタンスではありません。

基本的に、サーブレットから ejb のメソッドを呼び出すたびに、スタブは ejb コンテナーに ejb への参照を要求し、コンテナーはプールから使用可能な ejb を取得します。この ejb は要求を処理し、ジョブが完了するとプールに戻ってきます。

したがって、サーブレットが同時に複数のリクエストを処理する場合、スタブはリクエストごとに異なる ejb 参照を取得します。

スタブ オブジェクトの実装はスレッド セーフである必要があることに注意してください (ステートレス Bean の場合はそうです)。

Statless EJB はそのような使用法を作成しないため、これは悪い使用方法だと思います。

上記の点によると、はい、サーブレットから @EJB インジェクションを使用できます。

ルックアップ スタブ アプローチについて:

これも機能します (リクエストごとにスタブを取得します) が、ステートレスには必要なく、重要な欠点があります。ルックアップは時間のかかる操作であるため、サービス時間の応答に遅延が発生します。補償。

これがお役に立てば幸いです。

于 2013-11-10T00:39:46.067 に答える