原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic3
Weblogic Serverは各アプリケーションに対しデフォルトの事前構成済み管理対象スレッド・ファクトリを提供しているので、アプリケーションはWebコンポーネントやEJBコンポーネントで設定しなくても簡単に利用できます。Servletでデフォルトの管理対象スレッド・ファクトリを使う簡単な例からはじめてみましょう。
スレッドが中断されるまでデータをログ出力するRunnableなメソッドを作成します。
SomeServlet.javaがデフォルトの管理対象スレッド・ファクトリを注入し、スレッド作成に利用します。
各アプリケーションは自身でデフォルトの管理対象スレッド・ファクトリ・インスタンスを持っていますが、その他に、アプリケーション管理者やシステム管理者がカスタマイズされた管理対象スレッド・ファクトリを定義することができます。WebLogic Server管理コンソールでグローバルに定義された管理対象スレッド・ファクトリ・テンプレート(後でご紹介します)であってもランタイムではアプリケーション・スコープであることにご注意ください。
以下の4種類のアプリケーション・コンテキストが伝播されます。
グローバル(ドメインレベル)ランタイムスコープの最大同時新規スレッドと、サーバスコープの最大同時新規スレッドの違いに着目してください。WebLogic Server 12.2.1の重要機能の一つが、単一のWebLogic Serverドメインには複数のパーティションを含めることができるMultitenancyサポートです。グローバル(ドメインレベル)ランタイムの最大同時新規スレッドとは、グローバル(ドメインレベル)ランタイムのために、すべてのサーバの管理対象スレッド・ファクトリが作成したスレッドの最大個数であって、これにはサーバで動作するパーティションスコープ内で作成されたスレッドは含まれません。対して、サーバスコープの最大同時新規スレッドとはサーバのすべての管理対象スレッド・ファクトリが作成したスレッドの最大個数ですが、こちらの場合はパーティションのスコープ内で作成されたスレッドを含みます。パーティションスコープの最大同時新規スレッドについては、Part 5 - Multitenancy supportのエントリをご覧下さい。
管理対象スレッド・ファクトリを定義します。
管理対象スレッド・ファクトリ・インスタンスを取得して利用します。
Step1)
WebLogic Server管理コンソールから、同時管理対象オブジェクト・テンプレートのサマリーのページで、[新規]をクリックすると、管理対象スレッド・ファクトリ・テンプレートを作成することができます。[管理対象スレッド・ファクトリ・テンプレートの作成]ページで、管理対象スレッド・ファクトリ・テンプレートの名前やその他のパラメータを指定することができます。この例では、優先度3を持つtestMTFという管理対象スレッド・ファクトリ・テンプレートを作成しています。
Step2)
管理対象スレッド・ファクトリ・テンプレートを作成すると、WebLogic Serverの任意のアプリケーションが自身の管理対象スレッド・ファクトリ・インスタンスを取得して利用することができます。
WebLogic Server管理コンソールの[(ドメイン名)の設定]画面で、グローバル(ドメインレベル)ランタイムの最大同時新規スレッド数を編集できます。この例では、base_domainのグローバル(ドメインレベル)ランタイムの最大同時新規スレッドを100に設定しています。
WebLogic Server管理コンソールの[(サーバ名)の設定]画面で、サーバの最大同時新規スレッドを編集できます。この例では、myserverの最大同時新規スレッドを200に設定しています。
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なメソッドを作成します。
Step2)public class LoggerTask implements Runnable {
@Override
public void run() {
while (!Thread.interrupted()) {
// collect data and write them to database or file system
}
}
}
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)
Limit of Running Threads
newThreadメソッドが呼び出されると、WebLogic Serverは新しいスレッドを作成します。実行中スレッドの個数が過大である場合、サーバパフォーマンスや安定性に悪影響を与えるため、WebLogic Serverは管理対象スレッド・ファクトリの実行中スレッドの個数を制限するための設定(最大同時新規スレッド)をインスタンス、サーバのグローバル(ドメインレベル)ランタイム、サーバで提供しています。デフォルト設定値は以下の通りです。- 10:管理対象スレッド・ファクトリ・インスタンス
- 50:サーバのグローバル(ドメインレベル)ランタイム
- 100:サーバ
グローバル(ドメインレベル)ランタイムスコープの最大同時新規スレッドと、サーバスコープの最大同時新規スレッドの違いに着目してください。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管理対象スレッド・ファクトリは3個の上限値をいずれも超えない場合にのみ新たなスレッドを返します。例えば、サーバのグローバル(ドメインレベル)ランタイムにデプロイされたアプリケーションがあって、ServletやEJBがデフォルトの管理対象スレッド・ファクトリのnewThreadメソッドを呼び出したとしましょう。そこで
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic5
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_41.html
- この管理対象スレッド・ファクトリが作成した10個の実行中スレッドがある
- サーバのグローバル(ドメインレベル)ランタイムスコープの管理対象スレッド・ファクトリが作成した50個の実行中スレッドがある
- サーバの管理対象スレッド・ファクトリが作成した100個の実行中スレッドがある
Configuration
前述の通り、各アプリケーションは自身でデフォルトの管理対象スレッド・ファクトリを持っており、以下の値がデフォルトで設定されています。- 最大同時スレッド数:10
- デフォルトスレッド優先度:Thread.NORM_PRIORITY
- サーバ全体に対する最大同時スレッド数:100
Configure ManagedThreadFactories
名前、最大同時新規スレッド、優先度を管理対象スレッド・ファクトリ内で構成します。- 名前:管理対象スレッド・ファクトリを識別する文字列
- 最大同時新規スレッド:管理対象スレッド・ファクトリが作成する実行スレッド数の上限
- 優先度:スレッドの優先度
@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)また、WebLogicシステム管理者は事前定義済みの管理対象スレッド・ファクトリ・テンプレートを構成することができます。アプリケーションをデプロイすると、WebLogic Serverが管理対象スレッド・ファクトリ・テンプレートの設定に基づいて管理対象スレッド・ファクトリを作成します。作成された管理対象スレッド・ファクトリは全てこのアプリケーションのスコープに入っています。
Configuring Concurrent Managed Objects
https://docs.oracle.com/middleware/1221/wls/CNFGD/concurrent-utils.htm#CNFGD359
Example-2: Configure a ManagedThreadFactory in weblogic.xml
Step1)管理対象スレッド・ファクトリを定義します。
Step2)<!-- weblogic.xml -->
<managed-thread-factory>
<name>customizedMTF</name>
<priority>3</priority>
<max-concurrent-new-threads>20</max-concurrent-new-threads>
</managed-thread-factory>
管理対象スレッド・ファクトリ・インスタンスを取得して利用します。
@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:
- Concurrency Utilities support in WebLogic Server 12.2.1
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in.html - 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 - Concurrency Utilities support in WebLogic Server 12.2.1, Part Two: ManagedScheduledExecutorService
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic2
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_14.html - Concurrency Utilities support in WebLogic Server 12.2.1, Part Four: ContextService
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic4
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_28.html - Concurrency Utilities support in WebLogic Server 12.2.1, Part Five: Multitenancy
https://blogs.oracle.com/WebLogicServer/entry/concurrency_utilities_support_in_weblogic5
http://orablogs-jp.blogspot.jp/2015/12/concurrency-utilities-support-in_41.html
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