プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceでのアプリケーションの開発
12c (12.2.1.2.0)
E82725-02
目次へ移動
目次

前
次

31 スレッド実行の管理

この章では、タスク・タイムアウトを使用してCoherenceサービス・スレッドの実行動作を制御する方法と、カスタム実行処理のためのPriorityTask APIについて説明します。

この章の内容は次のとおりです。

31.1 優先度タスクの概要

Coherenceの優先度タスクを使用すると、レスポンス時間の要件が厳しいアプリケーションで、Coherence内のプロセス実行をより詳細に制御できます。たとえば、実行およびリクエストのタイムアウトを構成して、実行時間の長いスレッドの待機時間を制限できます。さらに、カスタム・タスクAPIを使用して、アプリケーションで問合せ処理を制御できます。これらの機能は、データ・グリッドのパフォーマンスおよびスループットに大きく影響する可能性があるため、細心の注意を払って使用してください。

31.2 優先度タスク・タイムアウトの設定

Coherenceのタスク実行タイムアウトの構成時には注意が必要です。この機能を実装する前であるため、タイムアウト例外を処理していないCoherenceアプリケーションの場合は特に当てはまります。たとえば、CacheStore内のライトスルーがブロックされ、構成済のタイムアウト値を超えた場合、Coherenceタスク・マネージャはスレッドの実行を中断しようとし、例外がスローされます。同様に、構成したタイムアウトを問合せや集計が超えた場合も、中断されて例外がスローされます。この機能を使用するアプリケーションでは、これらの例外を正常に処理してシステムの整合性を確保する必要があります。この構成はサービスごとに実行されるため、この機能を考慮せずに設計されている既存のキャッシュやサービスでこれらの設定を変更する場合は、細心の注意を払う必要があります。

この項には次のトピックが含まれます:

31.2.1 実行タイムアウトの構成

<request-timeout><task-timeout><task-hung-threshold>の各要素を使用して、サービスのワーカー・スレッドの実行タイムアウトを構成します。このタイムアウト設定はキャッシュ構成ファイルでサービス用に構成され、コマンド行パラメータを使用して設定することも可能です。サービス・ガーディアンの使用も参照してください。

表31-1では、実行タイムアウトの要素について説明します。

表31-1 実行タイムアウトの要素

要素名 説明

<request-timeout>

タイムアウト可能なリクエスト(たとえば、PriorityTaskインタフェースの実装)のデフォルト・タイムアウト値を指定します。ただし、リクエストのタイムアウト値は明示的に指定しません。リクエスト時間はクライアント側で測定されるもので、対応するサーバー・ノードに対して実行のためのリクエストが送信されてからの経過時間に次の時間を加えたものです。

  1. 実行側のノード(サーバー)にリクエストを配信するための所要時間

  2. タスクが受信されてサービス・キューに入れられてから実行が開始されるまでの間隔

  3. タスクの実行時間

  4. クライアントに結果を返信するための所要時間

値に単位が含まれていない場合は、ミリ秒が単位として適用されます。有効な値は、正の整数またはゼロです(ゼロの場合は、デフォルト・タイムアウトがないことを示します)。デフォルト値は、クラスタ化クライアント・リクエストの場合は無限タイムアウト(0s)、非クラスタ化クライアント・リクエストの場合は30秒(30s)です。

<task-timeout>

タイムアウト可能なタスク(たとえば、PriorityTaskインタフェースを実装するエントリ・プロセッサ)のデフォルト・タイムアウト値を指定します。ただし、タスク実行のタイムアウト値は明示的に指定しません。タスク実行時間はサーバー側で測定され、開始されるまでサービス・バックログ・キューで待機するための所要時間は含まれません。この属性は、スレッド・プールが使用されている(<thread-count-min>および<thread-count-max>の値が正数である)場合にのみ適用されます。zeroを指定すると、service-guardianのデフォルトの<timeout-milliseconds>値が使用されます。

<task-hung-threshold>

タスクが実行できる時間をミリ秒単位で指定します。この時間を超過すると、ハングしたと見なされます。注意: ポストされたタスクがまだ開始されていない場合は、ハングと見なされません。この属性は、スレッド・プールが使用されている(<thread-count-min>および<thread-count-max>の値が正数である)場合にのみ適用されます。

次の分散キャッシュの例では、サービスの動的なスレッド・プール、タスク・タイムアウト(5000ミリ秒)およびタスク・ハングしきい値(10000ミリ秒)を明示的に構成します。

<caching-schemes>
    <distributed-scheme>
      <scheme-name>example-distributed</scheme-name>
      <service-name>DistributedCache</service-name>
      <thread-count-min>7</thread-count-min>
      <thread-count-max>20</thread-count-max>
      <task-hung-threshold>10000</task-hung-threshold>
      <task-timeout>5000</task-timeout>
    </distributed-scheme>
</caching-schemes>

クライアント・リクエスト・タイムアウトを15ミリ秒に設定します。

<distributed-scheme>
      <scheme-name>example-distributed</scheme-name>
      <service-name>DistributedCache</service-name>
      <request-timeout>15000ms</request-timeout>
    </distributed-scheme>

注意:

request-timeoutは、常にthread-hung-thresholdtask-timeoutより長くする必要があります。

31.2.2 実行タイムアウトのコマンドライン・オプション

ノードのサービス・タイプのデフォルト(分散キャッシュ、起動、プロキシなど)を設定するには、コマンド行オプションを使用します。表31-2では、各オプションについて説明します。

表31-2 実行タイムアウトを設定するためのコマンドライン・オプション

オプション 説明

coherence.replicated.request.timeout

レプリケート・キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト

coherence.optimistic.request.timeout

オプティミスティック・キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト

coherence.distributed.request.timeout

分散キャッシュ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト

coherence.distributed.task.timeout

分散キャッシュ・サービス用のデフォルトのサーバー実行タイムアウト

coherence.distributed.task.hung

分散キャッシュ・サービスでスレッドがハングと報告されるまでのデフォルト時間

coherence.invocation.request.timeout

起動サービス用のデフォルトのクライアント・リクエスト・タイムアウト

coherence.invocation.task.hung

起動サービスでスレッドがハングと報告されるまでのデフォルト時間

coherence.invocation.task.timeout

起動サービス用のデフォルトのサーバー実行タイムアウト

coherence.proxy.request.timeout

プロキシ・サービス用のデフォルトのクライアント・リクエスト・タイムアウト

coherence.proxy.task.timeout

プロキシ・サービス用のデフォルトのサーバー実行タイムアウト

coherence.proxy.task.hung

プロキシ・サービスでスレッドがハングと報告されるまでのデフォルト時間

31.3 優先度タスク実行オブジェクトの作成

PriorityTaskインタフェースを使用すると、スレッド・プールを使用してタスク実行のスケジュールを指定する順序を制御したり、タスク実行時間を指定された限度まで保持できます。また、PriorityTaskのインスタンスは、通常、InvocableインタフェースまたはRunnableインタフェースも実装します。優先度タスクの実行と関連があるのは、タスクのバック・ログが存在する場合のみです。

APIでは、タスクの実行をスケジュールする次のような方法が定義されています。

  • SCHEDULE_STANDARD: タスクの実行は、自然な(リクエストの受信時間に基づいた)順序でスケジュールされます。

  • SCHEDULE_FIRST: タスクは、スケジュール優先度が同等以下のタスクの前にスケジュールされ、いずれかのワーカー・スレッドが使用可能になるとすぐに実行されます。

  • SCHEDULE_IMMEDIATE: タスクは、アイドル状態のワーカー・スレッドによってただちに実行されます。すべてアクティブな場合は、このタスクを実行するための新しいスレッドが作成されます。

この項には次のトピックが含まれます:

31.3.1 優先度タスク・オブジェクト作成用のAPI

Coherenceには、優先度タスク・オブジェクトの作成に役立つ次のクラスがあります。

  • PriorityProcessorは、カスタム・エントリ・プロセッサを作成する際に拡張できます。

  • PriorityFilterは、カスタム優先度フィルタを作成する際に拡張できます。

  • PriorityAggregatorは、カスタム集計を作成する際に拡張できます。

  • PriorityTaskは、優先度起動クラスを作成する際に拡張できます。

これらのクラスの拡張後、開発者はいくつかのメソッドを実装する必要があります。getRequestTimeoutMillisgetExecutionTimeoutMillisおよびgetSchedulingPriorityの戻り値は、クラスごとにアプリケーションの構成パラメータに保存する必要があります。表31-3に、これらのメソッドを示します。

表31-3 タスク・タイムアウトをサポートするメソッド

メソッド 説明

public long getRequestTimeoutMillis()

コール元スレッドがリクエスト実行の結果を待機することが可能な最大時間を取得します。リクエスト時間は、リクエストが実行のために対応するサーバー・ノードに送信された時点からの経過時間として、クライアント側で測定します。これには、リクエストを実行ノードに配信するまでの時間、タスクを受信しサービス・キューに配置してから実行が開始されるまでの間隔、タスク実行時間、結果をクライアントに戻すための時間が含まれます。TIMEOUT_DEFAULT値は、対応するサービス用に構成されたデフォルトのタイムアウト値を示し、TIMEOUT_NONE値は、タスクの実行が完了するまで、またはgetExecutionTimeoutMillis()値で指定されているタスク実行タイムアウトに従って、サービスがタスクの実行をキャンセルするまで、クライアント・スレッドが無限に待機できることを示します。

public long getExecutionTimeoutMillis()

対応するサービスによって停止されるまでの、このタスクの実行が許可されている最大時間を取得します。TIMEOUT_DEFAULT値は、対応するサービス用に構成されたデフォルトのタイムアウト値を示し、TIMEOUT_NONE値は、このタスクが無限に実行可能であることを示します。指定した時間が経過するまでにタスクが完了していない場合、サービスがThread.interrupt()メソッドを使用して実行を停止しようとします。スレッドを中断してもタスクが終了しない場合は、runCanceledメソッドがコールされます。

public int getSchedulingPriority()

このタスクのスケジュールの優先度を取得します。有効な値は、SCHEDULE_STANDARDSCHEDULE_FIRSTSCHEDULE_IMMEDIATEです。

public void runCanceled(boolean fAbandoned)

このメソッドがコールされるのは、このタスクを中断しようとする処理がすべて失敗した場合、または実行の機会がまったくないまま実行がキャンセルされた場合です。このメソッドは通常、サービス・スレッドでコールされ、実装によって遅延が発生すると対応するサービスも遅延するため、細心の注意を払って実装する必要があります。

31.3.2 タスク・タイムアウトによってスローされるエラー

タスク・タイムアウトが発生すると、ノードでRequestTimeoutExceptionが発生します。次に例を示します。

com.tangosol.net.RequestTimeoutException: Request timed out after 4015 millis
        at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.checkRequestTimeout(Service.CDB:8)
        at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.poll(Service.CDB:52)
        at com.tangosol.coherence.component.util.daemon.queueProcessor.Service.poll(Service.CDB:18)
        at com.tangosol.coherence.component.util.daemon.queueProcessor.service.InvocationService.query(InvocationService.CDB:17)
        at com.tangosol.coherence.component.util.safeService.SafeInvocationService.query(SafeInvocationService.CDB:1)