[Java, WLS] Concurrency Utilities support in WebLogic Server 12.2.1, Part Three: ManagedThreadFactory

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

Overview

ManagedThreadFactory(管理対象スレッド・ファクトリ)はWebLogic Serverが管理するスレッドを作成するために存在します。これはjava.util.concurrent.ThreadFactoryを拡張したもので、新規追加されたメソッドはありません。この管理対象スレッド・ファクトリはThreadFactory由来のnewThreadメソッドを提供し、ThreadFactoryを必要とする、例えばjava.util.concurrent.ExecutorsでJava SE concurrency utilities APIとともに利用できます。
Weblogic Serverは各アプリケーションに対しデフォルトの事前構成済み管理対象スレッド・ファクトリを提供しているので、アプリケーションはWebコンポーネントやEJBコンポーネントで設定しなくても簡単に利用できます。Servletでデフォルトの管理対象スレッド・ファクトリを使う簡単な例からはじめてみましょう。

Example-1: Use Default ManagedThreadFactory to Create a Thread in a Servlet

Step1)
スレッドが中断されるまでデータをログ出力するRunnableなメソッドを作成します。
public class LoggerTask implements Runnable {
    @Override
    public void run() {
        while (!Thread.interrupted()) {
            // collect data and write them to database or file system
        }
    }
}
Step2)
SomeServlet.javaがデフォルトの管理対象スレッド・ファクトリを注入し、スレッド作成に利用します。
@WebServlet("/SomeServlet")
public class SomeServlet extends HttpServlet {
    @Resource ManagedThreadFactory mtf;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Thread t = mtf.newThread(new LoggerTask());
        t.start();
        // Do something else and reply to the user
    }
}

Runtime Behavior

Application Scoped Instance

管理対象スレッド・ファクトリはアプリケーション・スコープです。各アプリケーションは自身で管理対象スレッド・ファクトリ・インスタンスを持っており、管理対象スレッド・ファクトリ・インスタンスのライフサイクルはアプリケーションにバインドされています。管理対象スレッド・ファクトリが作成したスレッドもまたアプリケーション・スコープなので、アプリケーションが停止した場合、関連するスレッドも中断されます。
各アプリケーションは自身でデフォルトの管理対象スレッド・ファクトリ・インスタンスを持っていますが、その他に、アプリケーション管理者やシステム管理者がカスタマイズされた管理対象スレッド・ファクトリを定義することができます。WebLogic Server管理コンソールでグローバルに定義された管理対象スレッド・ファクトリ・テンプレート(後でご紹介します)であってもランタイムではアプリケーション・スコープであることにご注意ください。

Context Propagation

管理対象スレッド・ファクトリは管理対象スレッド・ファクトリ作成時にアプリケーション・コンテキストを取得(newThreadメソッドを呼び出したタイミングではありません)し、取得したアプリケーション・コンテキストをタスク実行前に伝播するので、タスクもまたアプリケーション・コンテキストを持って実行できます。
以下の4種類のアプリケーション・コンテキストが伝播されます。
  • JNDI
  • クラスローダ(ClassLoader)
  • セキュリティ(Security)
  • ワークエリア(WorkArea)
伝播されたコンテキストタイプは4種類の同時管理対象オブジェクトの4種類と同じです。

Limit of Running Threads

newThreadメソッドが呼び出されると、WebLogic Serverは新しいスレッドを作成します。実行中スレッドの個数が過大である場合、サーバパフォーマンスや安定性に悪影響を与えるため、WebLogic Serverは管理対象スレッド・ファクトリの実行中スレッドの個数を制限するための設定(最大同時新規スレッド)をインスタンス、サーバのグローバル(ドメインレベル)ランタイム、サーバで提供しています。デフォルト設定値は以下の通りです。
  • 10:管理対象スレッド・ファクトリ・インスタンス
  • 50:サーバのグローバル(ドメインレベル)ランタイム
  • 100:サーバ
いずれかの制限を超えた場合、管理対象スレッド・ファクトリのnewThread()メソッド呼び出しでnullを返します。
グローバル(ドメインレベル)ランタイムスコープの最大同時新規スレッドと、サーバスコープの最大同時新規スレッドの違いに着目してください。WebLogic Server 12.2.1の重要機能の一つが、単一のWebLogic Serverドメインには複数のパーティションを含めることができるMultitenancyサポートです。グローバル(ドメインレベル)ランタイムの最大同時新規スレッドとは、グローバル(ドメインレベル)ランタイムのために、すべてのサーバの管理対象スレッド・ファクトリが作成したスレッドの最大個数であって、これにはサーバで動作するパーティションスコープ内で作成されたスレッドは含まれません。対して、サーバスコープの最大同時新規スレッドとはサーバのすべての管理対象スレッド・ファクトリが作成したスレッドの最大個数ですが、こちらの場合はパーティションのスコープ内で作成されたスレッドを含みます。パーティションスコープの最大同時新規スレッドについては、Part 5 - Multitenancy supportのエントリをご覧下さい。
Concurrency Utilities support in WebLogic Server 12.2.1, Part Five: Multi-tenancy Support
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic5
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_41.html
管理対象スレッド・ファクトリは3個の上限値をいずれも超えない場合にのみ新たなスレッドを返します。例えば、サーバのグローバル(ドメインレベル)ランタイムにデプロイされたアプリケーションがあって、ServletやEJBがデフォルトの管理対象スレッド・ファクトリのnewThreadメソッドを呼び出したとしましょう。そこで
  • この管理対象スレッド・ファクトリが作成した10個の実行中スレッドがある
  • サーバのグローバル(ドメインレベル)ランタイムスコープの管理対象スレッド・ファクトリが作成した50個の実行中スレッドがある
  • サーバの管理対象スレッド・ファクトリが作成した100個の実行中スレッドがある
のいずれかの場合にnullを返します。後の章で最大同時新規スレッドの指定方法の例をご紹介します。

Configuration

前述の通り、各アプリケーションは自身でデフォルトの管理対象スレッド・ファクトリを持っており、以下の値がデフォルトで設定されています。
  • 最大同時スレッド数:10
  • デフォルトスレッド優先度:Thread.NORM_PRIORITY
また、
  • サーバ全体に対する最大同時スレッド数:100
がデフォルトで設定されています。デフォルトの設定が十分ではない場合、設定方法を記載していますので続きを読んでください。例えば、より高い優先度を持つスレッドを作成する必要がある場合、管理対象スレッド・ファクトリを構成する必要がありますし、100個を上回る同時実行スレッドがサーバに存在する可能性がある場合、サーバスコープの最大同時新規スレッドを変更する必要があるでしょう。

Configure ManagedThreadFactories

名前、最大同時新規スレッド、優先度を管理対象スレッド・ファクトリ内で構成します。
  • 名前:管理対象スレッド・ファクトリを識別する文字列
  • 最大同時新規スレッド:管理対象スレッド・ファクトリが作成する実行スレッド数の上限
  • 優先度:スレッドの優先度
アプリケーションはDD(デプロイメント・ディスクリプタ:weblogic-application.xml/weblogic-ejb-jar.xml/weblogic.xml)で管理対象スレッド・ファクトリを構成することができます。その管理対象スレッド・ファクトリ・インスタンスを@Resource(mappedName=<管理対象スレッド・ファクトリの名前>)で取得してスレッドを作成します。アノテーションの他に、アプリケーションは管理対象スレッド・ファクトリ・インスタンスを<resource-env-description>や<resource-env-ref>をDDで指定することで、JNDIにバインドすれば、JNDI Naming Contextを使って検索することができます。詳細は以下の製品ドキュメントをご覧下さい。
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
また、WebLogicシステム管理者は事前定義済みの管理対象スレッド・ファクトリ・テンプレートを構成することができます。アプリケーションをデプロイすると、WebLogic Serverが管理対象スレッド・ファクトリ・テンプレートの設定に基づいて管理対象スレッド・ファクトリを作成します。作成された管理対象スレッド・ファクトリは全てこのアプリケーションのスコープに入っています。

Example-2: Configure a ManagedThreadFactory in weblogic.xml

Step1)
管理対象スレッド・ファクトリを定義します。
<!-- weblogic.xml -->
<managed-thread-factory>
    <name>customizedMTF</name>
    <priority>3</priority>
    <max-concurrent-new-threads>20</max-concurrent-new-threads>
</managed-thread-factory>
Step2)
管理対象スレッド・ファクトリ・インスタンスを取得して利用します。
@WebServlet("/SomeServlet")
public class SomeServlet extends HttpServlet {

    @Resource(mappedName="customizedMTF")
    ManagedThreadFactory mtf;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Runnable aTask = new Runnable() {
            ...
        };
        Thread t = mtf.newThread(aTask);
        t.start();
        ...
    }
}

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

個別アプリケーションではなく複数のアプリケーションに要件がある場合、管理対象スレッド・ファクトリ・テンプレートをグローバルに作成して全てのアプリケーションで利用可能にすることができます。例えば、すべてのアプリケーションから低優先度のスレッドを作成する必要がある場合、管理対象スレッド・ファクトリ・テンプレートを構成する必要があります。前述のように、管理対象スレッド・ファクトリ・テンプレートがあれば、WebLogic Serverはテンプレートの設定に基づいて管理対象スレッド・ファクトリ・インスタンスを各アプリケーションのために作成します。

Step1)
WebLogic Server管理コンソールから、同時管理対象オブジェクト・テンプレートのサマリーのページで、[新規]をクリックすると、管理対象スレッド・ファクトリ・テンプレートを作成することができます。[管理対象スレッド・ファクトリ・テンプレートの作成]ページで、管理対象スレッド・ファクトリ・テンプレートの名前やその他のパラメータを指定することができます。この例では、優先度3を持つtestMTFという管理対象スレッド・ファクトリ・テンプレートを作成しています。



Step2)
管理対象スレッド・ファクトリ・テンプレートを作成すると、WebLogic Serverの任意のアプリケーションが自身の管理対象スレッド・ファクトリ・インスタンスを取得して利用することができます。
@WebServlet("/SomeServlet")
public class SomeServlet extends HttpServlet {

    @Resource(mappedName="testMTF")
    ManagedThreadFactory mtf;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Runnable aTask = new Runnable() {
            ...
        };
        Thread t = mtf.newThread(aTask);
        t.start();
        ...
    }
}

Configure Max Concurrent New Threads in global (domain-level) runtime scope or server scope


Example-4: Configure global (domain-level) runtime Scope Max Concurrent New Threads

グローバル(ドメインレベル)ランタイムの最大同時新規スレッドとは、サーバのグローバル(ドメインレベル)ランタイムの管理対象スレッド・ファクトリが作成するスレッド数の上限であり、これには当該サーバで動作するパーティションスコープ内で作成されたスレッドの個数は含まれません。
WebLogic Server管理コンソールの[(ドメイン名)の設定]画面で、グローバル(ドメインレベル)ランタイムの最大同時新規スレッド数を編集できます。この例では、base_domainのグローバル(ドメインレベル)ランタイムの最大同時新規スレッドを100に設定しています。

Example-5: Configure Server Scope Max Concurrent New Threads

サーバの最大同時新規スレッドは当該サーバのすべての管理対象スレッド・ファクトリが作成する実行スレッド数の上限です。
WebLogic Server管理コンソールの[(サーバ名)の設定]画面で、サーバの最大同時新規スレッドを編集できます。この例では、myserverの最大同時新規スレッドを200に設定しています。


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 件のコメント:

コメントを投稿