[Java, WLS] Concurrency Utilities support in WebLogic Server 12.2.1, Part Two: ManagedScheduledExecutorService

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic2

Overview

ManagedScheduledExecutorService(管理対象スケジュール済エグゼキュータ・サービス)はManagedExecutorService(管理対象エグゼキュータ・サービス)を拡張したもので、管理対象エグゼキュータ・サービス由来の全てのメソッドは管理対象スケジュール済エグゼキュータ・サービスでサポートされています。それゆえ、この記事の前に是非Part 1をお読み下さい。
Concurrency Utilities support in WebLogic Server 12.2.1, Part One: ManagedExecutorService
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic1
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_66.html
管理対象スケジュール済エグゼキュータ・サービスはjava.util.concurrent.ScheduledExecutorServiceを拡張したものゆえ、特定の遅延後もしくは定期的に実行するタスクのスケジュールのためのScheduledExecutorService由来のメソッド(schedule、scheduleAtFixedRate、scheduleAtFixedDelay)を提供します。それ以外に、管理対象スケジュール済エグゼキュータ・サービスは、トリガーベースのカスタムスケジュールでタスクを動作するための新たなメソッドを提供します。こうした全てのタスクはWebLogic Serverが提供するスレッド上で動作します。
Weblogic Serverはデフォルトの事前構成済み管理対象スケジュール済エグゼキュータ・サービスを各アプリケーションのために提供しているので、これを設定せずにWebコンポーネントやEJBコンポーネントで簡単に利用できます。デフォルトの管理対象スケジュール済エグゼキュータ・サービスをServletContextListenerで使うという簡単な例から始めましょう。

Example-1: Use Default ManagedScheduledExecutorService to Submit a Periodical Task

Step1)
データをログ出力するタスクを作成します。
public class LoggerTask implements Runnable {
    @Override
    public void run() {
        // collect data and write them to database or file system
    }
}
Step2)
SomeListener.javaがデフォルトの管理対象スケジュール済エグゼキュータ・サービスを注入します。このコードはcontextInitializedでタスクを定期的にスケジューリングし、contextDestroyedでタスクをキャンセルします。
@WebListener
public class SomeListener implements ServletContextListener {
    Future loggerHandle = null;
    @Resource ManagedScheduledExecutorService mses;


    public void contextInitialized(ServletContextEvent scEvent) {
        // Creates and executes LoggerTask every 5 seconds, beginning at 1 second later 
        loggerHandle = mses.scheduleAtFixedRate(new LoggerTask(), 1, 5, TimeUnit.SECONDS);
    }

    public void contextDestroyed(ServletContextEvent scEvent) {
        // Cancel and interrupt our logger task
        if (loggerHandle != null) {
            loggerHandle.cancel(true);
        }
    }
}

Runtime Behavior

管理対象スケジュール済エグゼキュータ・サービスはPart 1のRuntime Behaviorで説明したすべての機能を提供します。
Concurrency Utilities support in WebLogic Server 12.2.1, Part One: ManagedExecutorService
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic1
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_66.html
前述の通り、管理対象スケジュール済エグゼキュータ・サービスはタスクを定期的もしくはカスタムスケジュールで実行することができるので、タスクは複数回実行される可能性があります。長時間実行タスクの場合、タスクが1回以上実行されるとしても、WebLogic Serverは最初の実行時にこの長時間実行タスクのために1スレッドのみ作成します。

Configuration


Configure ManagedScheduledExecutorService

管理対象スケジュール済エグゼキュータ・サービスには管理対象エグゼキュータ・サービスと同じ構成(名前、ディスパッチ・ポリシー、最大同時長時間リクエスト、長時間実行の優先度)があります。カスタマイズされた管理対象スケジュール済エグゼキュータ・サービスを取得、利用する方法もまた管理対象エグゼキュータ・サービスに似ています。

Example-2: Configure a ManagedScheduledExecutorService in weblogic.xml

Step1)
管理対象スケジュール済エグゼキュータ・サービスを定義します。
<!-- weblogic.xml -->
<work-manager>
 <name>customizedWM</name>
    <max-threads-constraint>
        <name>max</name>
        <count>1</count>
    </max-threads-constraint>
</work-manager>
<managed-scheduled-executor-service>
    <name>customizedMSES</name>
    <dispatch-policy>customizedWM</dispatch-policy>
    <long-running-priority>10</long-running-priority>
    <max-concurrent-long-running-requests>20</max-concurrent-long-running-requests>
</managed-scheduled-executor-service>
Step2)
管理対象スケジュール済エグゼキュータ・サービス・インスタンスを取得して利用します。
@WebServlet("/SomeServlet")
public class SomeServlet extends HttpServlet {
    @Resource(mappedName="customizedMSES")
    ManagedScheduledExecutorService mses;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Runnable aTask = new Runnable() {
            ...
        };
        mses.schedule(aTask, 5, TimeUnit.SECONDS);
        ...
    }
}

Example-3: Configure a ManagedScheduledExecutorService template using WebLogic Administration Console

Step1)
WebLogic Server管理コンソールで、[同時管理対象オブジェクト・テンプレートのサマリ]ページで[新規]ボタンをクリックすると、管理対象スケジュール済エグゼキュータ・サービス・テンプレートを作成することができます。[新規管理対象スケジュール済エグゼキュータ・サービス・テンプレートの作成]ページで、新たな管理対象スケジュール済エグゼキュータ・サービス・テンプレートの名前やその他のパラメータを指定することができます。この例では、testMSESという管理対象スケジュール済エグゼキュータ・サービスを作成し、事前定義済みのワークマネージャtestWMにマッピングしています。

Step2)
管理対象スケジュール済エグゼキュータ・サービス・テンプレートを作成したら、WebLogic Serverの任意のアプリケーションが自身の管理対象スケジュール済エグゼキュータ・サービス・インスタンスを取得して利用することができます。
@WebServlet("/SomeServlet")
public class SomeServlet extends HttpServlet {
    @Resource(mappedName="testMSES")
    ManagedScheduledExecutorService mses;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Runnable aTask = new Runnable() {
            ...
        };
        mses.schedule(aTask, 5, TimeUnit.SECONDS);
        ...
    }
}

Related Articles:

詳細は、ドキュメントの以下の項をご覧下さい。
Oracle® Fusion Middleware Administering Server Environments for Oracle WebLogic Server 12c (12.2.1)
Configuring Concurrent Managed Objects
https://docs.oracle.com/middleware/1221/wls/CNFGD/concurrent-utils.htm#CNFGD359

0 件のコメント:

コメントを投稿