0

Java EE Web アプリケーションに取り組んでいます。@WebListener アノテーションを使用して、スケジュールされたバッチを開発しました。

@WebListener
public class BatchServlet implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        context = sce.getServletContext();
        schedulerEngine = Executors.newSingleThreadScheduledExecutor();
        schedulerEngine.scheduleAtFixedRate(new MyThread(), 0, 300, TimeUnit.SECONDS);
    }


public class MyThread implements Runnable {
        @Override
        public void run() {
            ...... //my business logic
        }

そしてそれは正しく動作します。

しかし、私の目的のために、たとえば、サーブレット内で特定のリクエストを受け取ったときに、MyThread() バッチをオンデマンドで強制する必要があります。明らかに、MyBatch スレッドを個別に呼び出すことができますが、この操作を実行するためのベスト プラクティスがいくつかあるのではないかと考えていました。

4

1 に答える 1

0

いくつかのオプションがあります: 通常のスレッド プール (複数のスレッドを含む) を作成し、タスクが入ってくるたびにエグゼキューター キューに入れます。

より細かい制御が必要な場合は、サーブレットと 1 つのスレッドの間で同時キューのようなものを共有できます。このスレッドがキューから読み取れるようにします。キューが空になると、スレッドは自動的にブロックされます。

次に、サーブレットはこのキューに作業を配置できます。アイテムの取得でスレッドがブロックされた場合、スレッドは自動的にウェイクアップします。

「生産者 - 消費者」パターンを調べたいと思うかもしれません。これについては多くの文献があります。

于 2013-02-21T10:14:06.263 に答える