2

外部ソースから情報を取得し、同じ JVM で対応する AsyncContext オブジェクトを完了するには、Web/JavaEE コンテナーにスレッドが必要です。

追加遅延ゼロのソリューションが必要なため、定期的なポーリングまたはタイマーは除外されます。

スレッドを開始することはできましたが、Web コンテナーでは嫌われ、移植性がないと思います。Q1. 代わりに Java EE コンテナーでスレッドを移植可能に実行することは可能ですか?

Q2. とにかく Web コンテナーでスレッドを実行したい場合、「すべての悪の中で最も少ない」方法は何ですか? コンテキストを初期化しますか? ExecutorService? スレッド実行?

ありがとう!

4

3 に答える 3

3

AsyncContext.html#startは、おそらく取得できる最も近いものです。

于 2012-04-25T05:11:08.863 に答える
1

jsr237のワークマネージャを使用して、JavaEEコンテナにスレッドを作成できます。: http: //jcp.org/en/jsr/detail?id=237。非同期ジョブが必要な場合は、JMSを使用する必要があります。

于 2012-04-23T09:32:23.780 に答える
1

Java EE 6 では@Asynchronous、EJB メソッドにアノテーションを付けて、そのメソッドでの作業を特別なスレッドプールで処理することができます。

@Stateless
public class SomeBean {

    @Asynchronous
    public void doSomething() {
        // ...
    }
}

次に、別の場所で、この Bean を注入してdoSomething()メソッドを呼び出します。コントロールはすぐに戻ります。

@WebServlet("/test")
public class SyncServlet extends HttpServlet {

    @EJB
    private SomeBean someBean;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        someBean.doSomething();
    }
}

ここのようなものは必要ないかもしれないAsyncContext asyncContext = request.startAsync()ことに注意してください。これは、非同期コードが応答に何かを送信する必要がある場合にのみ使用します。

ただし、期間タイマーに似たものが必要で、リクエストに応じて何かを行わない場合は、シングルトンでタイマー サービスを使用できます。

@Startup
@Singleton
public class SomeTimerBean {

    @Schedule(hour = "*", minute = "*/30", second = "0", persistent = false)
    public void doStuff() {
        // ...
    }
}

定期的に実行する代わりに、@TimeOutアノテーションを使用して次のようなものを 1 回実行することもできます。

@Startup
@Singleton
public class SomeTimerBean {

    @Resource
    private TimerService timerService;

    @Postconstruct
    public void init() {
         timerService.createSingleActionTimer(0, new TimerConfig(null, false));
    }

    @Timeout
    public void doStuff(Timer timer) {
        // ...
    }
}

これにバリエーションを持たせることができます。たとえば、基本的に同じ効果を得るために、他のBean のメソッドをSomeTimerBean呼び出すこともできます。@Asynchronous

于 2012-04-28T09:26:08.813 に答える