ヘッダーをスキップ
Oracle Coherence開発者ガイド
リリース3.5
B56039-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

9 優先度タスク

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

優先度タスク: タイムアウト

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

実行タイムアウトの構成

実行タイムアウトを構成する場合、request-timeout、task-timeoutおよびtask-hung-thresholdの値を考慮する必要があります(「実行タイムアウトのパラメータ」を参照)。request-timeoutは、リクエストが返されるまでのクライアントの待機時間です。task-timeoutは、サーバーでスレッドの実行が許可される時間です。この時間を超過すると、実行が中断されます。task-hung-thresholdは、スレッドが実行可能な時間です。この時間を超過すると、スレッドはハングしていると報告されます。ハングしたスレッドは、レポート目的でのみ使用されます。これらのタイムアウト設定はミリ秒単位であり、coherence-cache-config.xmlで、またはコマンドライン・パラメータを使用して構成されます。

実行タイムアウトのパラメータ

表9-1では、実行タイムアウトのパラメータについて説明します。

表9-1 実行タイムアウトのパラメータ

パラメータ名 説明

<task-hung-threshold>

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

<task-timeout>

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

<request-timeout>

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

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

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

  3. タスクの実行時間

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


分散キャッシュ・スレッド・カウントを7、タスク・タイムアウトを5000ミリ秒、タスク・ハングしきい値を10000ミリ秒に設定するには、該当するノードのcoherence-cache-config.xmlに次の内容を追加する必要があります。

例9-1 タスク時間およびタスク・ハング・コンフィギュレーションのサンプル

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

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

例9-2 クライアント・リクエスト・タイムアウト・コンフィギュレーションのサンプル

<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より長くする必要があります。

コマンドライン・オプション

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

表9-2 サービス・タイプの設定用のコマンドライン・オプション

オプション 説明

tangosol.coherence.replicated.request.timeout

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

tangosol.coherence.optimistic.request.timeout

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

tangosol.coherence.distributed.request.timeout

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

tangosol.coherence.distributed.task.timeout

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

tangosol.coherence.distributed.task.hung

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

tangosol.coherence.invocation.request.timeout

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

tangosol.coherence.invocation.task.hung

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

tangosol.coherence.invocation.task.timeout

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

tangosol.coherence.proxy.request.timeout

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

tangosol.coherence.proxy.task.timeout

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

tangosol.coherence.proxy.task.hung

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


優先度タスクの実行: カスタム・オブジェクト

PriorityTaskインタフェースを使用すると、スレッド・プールを使用してサービスがタスクの実行をスケジュールする順序を制御し、実行時間を指定した制限値に抑えることができます。PriorityTaskのインスタンスでは通常、InvocableまたはRunnableのいずれかのインタフェースも実装されます。優先度タスクの実行は、タスクのバック・ログが存在する場合にのみ可能です。

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

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

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

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

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

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

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

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

表9-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)

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


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

タスク・タイムアウトが発生すると、ノードでRequestTimeoutExceptionが発生します。例9-3は、スローされる可能性のある例外を示しています。

例9-3 タスク・タイムアウトによってスローされる例外

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)