(57)【要約】【課題】処理の整合性を確保することができるようにする。【解決手段】  メソッドを実行する第１及び第２のスレッドを実行する情報処理装置において、第１のスレッドが第２のスレッドの実行中止命令を前記第２のスレッドに送信する。第２のスレッドは、実行中止命令の受信に応じて、実行中の第１のメソッドの実行を中止するとともに、第１のメソッドの次に実行すべき第２のメソッドの実行を開始する。【選択図】  図１
2006146678.tif 000002
【特許請求の範囲】
【請求項１】
メソッドを実行する第１及び第２のスレッドを実行する情報処理装置におけるメソッドの処理方法であって、
前記第１のスレッドが前記第２のスレッドの実行中止命令を前記第２のスレッドに送信するステップと、
前記第２のスレッドが、前記実行中止命令の受信に応じて、実行中の第１のメソッドの実行を中止するとともに、前記第１のメソッドの次に実行すべき第２のメソッドの実行を開始するステップと、
を含むことを特徴とするメソッドの処理方法。
【請求項２】
請求項１に記載のメソッドの処理方法であって、
中止すべきでないメソッドを特定する情報をメモリに記憶するステップと、
前記第１のスレッドが、前記第１のメソッドが前記情報で特定されるメソッドであるかどうかを判断するステップと、
前記第１のスレッドが、前記第１のメソッドが前記情報で特定されるメソッドでない場合に前記実行中止命令を前記第２のスレッドに送信するステップと、
をさらに含むことを特徴とするメソッドの処理方法。
【請求項３】
請求項１に記載のメソッドの処理方法であって、
前記第１のメソッドの最大実行時間をメモリに記憶するステップと、
前記第１のスレッドが、前記第１のメソッドの実行時間が前記最大実行時間を超えると前記実行中止命令を前記第２のスレッドに送信するステップと、
をさらに含むことを特徴とするメソッドの処理方法。
【請求項４】
請求項３に記載のメソッドの処理方法であって、
前記第１のスレッドが、前記第１のメソッドの実行時間が前記最大実行時間を超えると、前記第２のスレッドが実行する前記メソッドの実行に関する情報をメモリに書き出すステップと、
前記第２のスレッドが、前記第１のメソッドの実行を中止すると、当該第２のスレッドが実行する前記メソッドの実行に関する情報を前記メモリに書き出すステップと、
をさらに含むことを特徴とするメソッドの処理方法。
【請求項５】
請求項１に記載のメソッドの処理方法であって、
前記第１のメソッドの最大実行時間をメモリに記憶するステップと、
第３のスレッドが、前記第２のスレッドによる前記第１のメソッドの実行時間が前記最大実行時間を超えると、前記第２のスレッドを特定する情報を、前記メモリに構築されるキューに追加するステップを含み、
前記第１のスレッドは、前記キューに登録されている前記第２のスレッドを特定する情報を読み出し、読み出した前記情報により特定される前記第２のスレッドに対して、前記実行中止命令を送信すること、
を特徴とするメソッドの処理方法。
【請求項６】
請求項１に記載のメソッドの処理方法であって、
前記第２のスレッドが、前記第１のメソッドにおいて他のスレッドとの間で共有している資源に対するロックの取得、及びデータベースに対するトランザクション処理のうち、少なくとも何れかが行われているかどうかを判断するステップと、
前記第２のスレッドが、前記ロックの取得及び前記トランザクション処理のうち少なくとも何れかが行われている場合に、前記第１のメソッドの実行を中止するとともに、前記ロックの解放及び前記トランザクション処理のロールバックのうち、少なくとも何れかを行うステップと、
をさらに含むことを特徴とするメソッドの処理方法。
【請求項７】
請求項１に記載のメソッドの処理方法であって、
ユーザから前記第２のスレッドによるメソッドの実行を中止する旨の指示を受け付けるステップを含み、
前記第１のスレッドは、前記指示に応じて前記実行中止命令を前記第２のスレッドに送信すること、
を特徴とするメソッドの処理方法。
【請求項８】
ＣＰＵと、メモリと、
メソッドを実行する第１及び第２のスレッドを実行するスレッド実行部と、
前記第１のスレッドから、前記第２のスレッドの実行中止命令を第２のスレッドに送信させる実行中止命令送信部と、
前記実行中止命令の受信に応じて、実行中の第１のメソッドの実行を中止するとともに、前記第１のメソッドの次に実行すべき第２のメソッドの実行を前記第２のスレッドに開始させるメソッド実行部と、
を備えることを特徴とする情報処理装置。
【請求項９】
請求項８に記載の情報処理装置であって、
前記第２のスレッドにより実行されるメソッドを記憶するスタックと、
前記第２のスレッドにより実行されるメソッドを特定する情報に対応付けて、当該メソッドの最大実行時間を記憶する最大実行時間記憶部と、
前記第２のスレッドにより実行されたメソッドを特定する情報と、当該メソッドが前記スタックに記憶された実行開始時刻とを対応付けて記憶する実行開始時刻記憶部と、
中止すべきでないメソッドを特定する情報である保護対象メソッド特定情報を記憶する保護メソッド記憶部と、
前記第１のスレッドを特定する情報に対応する、前記最大実行時間及び前記実行開始時刻を読み出し、当該実行開始時刻に基づいて前記第１のメソッドの実行時間を算出する実行時間算出部と、
前記実行時間が前記最大実行時間を超えている場合に、前記第１のメソッドが前記保護メソッド記憶部に記憶されている前記保護対象メソッド特定情報で特定されるメソッドであるかどうかを判断する保護判断部と、
を備え、
前記中止命令送信部は、前記第１のメソッドが前記保護対象メソッド特定情報で特定されるメソッドでない場合に、前記第１のスレッドから前記第２のスレッドに前記実行中止命令を送信させること、
を特徴とする情報処理装置。
【請求項１０】
メソッドを実行する第１及び第２のスレッドを実行するコンピュータに、
前記第１のスレッドが前記第２のスレッドの実行中止命令を前記第２のスレッドに送信するステップと、
前記第２のスレッドが、前記実行中止命令の受信に応じて、実行中の第１のメソッドの実行を中止するとともに、前記第１のメソッドの次に実行すべき第２のメソッドの実行を開始するステップと、
を実行させるためのプログラム。
【請求項１１】
プログラムを実行する第１及び第２のスレッドを実行する情報処理装置におけるプログラムの処理方法であって、
前記第１のスレッドが前記第２のスレッドの実行中止命令を前記第２のスレッドに送信するステップと、
前記第２のスレッドが、前記実行中止命令の受信に応じて、実行中の第１のプログラムの実行を中止するとともに、前記第１のプログラムの次に実行すべき第２のプログラムの実行を開始するステップと、
を含むことを特徴とするプログラムの処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置におけるプログラム制御方法、情報処理装置、及びプログラムに関する。
【背景技術】
【０００２】
複数のスレッドを並列処理する仕組みにおいて、あるスレッドの処理負荷が大きくなり過ぎると、そのスレッドをスレッド単位で強制終了する仕組みが知られている（例えば特許文献１を参照）。
【特許文献１】特開２００１−１２５８００号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
上記のスレッド単位で強制終了する仕組みでは、例えば強制終了の原因となったメソッドにより共有資源に対するロックが取得され、そのメソッドに後続するメソッドにより前記ロックの解除がなされる場合には、後続するメソッドが実行される前にスレッドが終了してしまい、ロックが解除されず、処理の整合性が確保できなくなってしまうという問題がある。
【０００４】
本発明は、このような問題に鑑みてなされたものであり、スレッド単位での処理の整合性を確保することができる、情報処理装置におけるプログラム制御方法、情報処理装置、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００５】
上記課題を解決するための本発明の主たる発明は、メソッドを実行する第１及び第２のスレッドを実行する情報処理装置におけるメソッドの処理方法であって、前記第１のスレッドが前記第２のスレッドの実行中止命令を前記第２のスレッドに送信するステップと、前記第２のスレッドが、前記実行中止命令の受信に応じて、実行中の第１のメソッドの実行を中止するとともに、前記第１のメソッドの次に実行すべき第２のメソッドの実行を開始するステップと、を含むこととする。
【発明の効果】
【０００６】
本発明によれば、処理の整合性を確保することができる。
【発明を実施するための最良の形態】
【０００７】
図１に本実施形態に係る情報処理システム１の全体構成を示している。情報処理システム１は、クライアント装置１０とサーバ装置２０を含んで構成されている。クライアント装置１０とサーバ装置２０とは、通信ネットワーク３０を介して互いに通信可能に接続している。通信ネットワーク３０は、例えばインターネットやＬＡＮ（Local Area Network）、無線ネットワーク、公衆電話回線、携帯電話回線網である。
【０００８】
クライアント装置（端末）１０は、例えばパーソナルコンピュータやワークステーションなどである。クライアント装置１０では、Ｗｅｂブラウザが動作している。サーバ装置２０では例えばオンライン書店などのＷｅｂサービスが提供されており、利用者はクライアント装置１０で動作するＷｅｂブラウザを操作してサーバ装置２０にアクセスする。
【０００９】
サーバ装置２０（情報処理装置）は、例えば、パーソナルコンピュータや、ワークステーションである。サーバ装置２０では、特定のＵＲＬ（Uniform Resource Locator）に対するリクエストに応じて動的なＷｅｂページや画像などを提供するサーバサイドＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）によるアプリケーションサーバが動作している。
【００１０】
アプリケーションサーバは、データベースに対する接続機能や、複数の処理を連結するトランザクション管理機能などを提供する機能（以下、コンテナという。）が実現されている。コンテナは、Ｊａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）言語により記述されたプログラムを実行する。これによりアプリケーションサーバにおける各種の処理が実現される。具体的なコンテナとしては、例えばサーブレットコンテナやＥＪＢ（Enterprise JavaBeans；サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）コンテナがある。
【００１１】
アプリケーションサーバでは、複数のスレッドが実行されている。関数型又は手続型の言語によりアプリケーションサーバを実現するプログラムが記述される場合には、スレッドは、オペレーティングシステムが管理する処理単位であるプロセスである。スレッドの具体例として、例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）の仮想マシンにおける処理単位としてのスレッドがある。スレッドは一連の手続を実行する。この手続きは、例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）のクラスから生成されるオブジェクトのメソッドであり、プログラムである。以下、スレッドにおいて実行される手続であるオブジェクトのメソッド及びプログラムを総称してメソッドと称する。
【００１２】
図２にサーバ装置２０のハードウェア構成を示している。同図に示すように、サーバ装置２０は、ＣＰＵ２０１、メモリ２０２、記憶装置２０３、記憶媒体読取装置２０４、通信インタフェース２０５を備えている。
【００１３】
記憶装置２０３は、例えば、ハードディスクやフラッシュメモリなどである。記憶装置２０３にはプログラムやデータが記憶されている。記録媒体読取装置２０４は、記録媒体２０６に記憶されているプログラムやデータを読み出して、メモリ２０２や記憶装置２０３に格納する。記録媒体読取装置２０４は、例えば、ＣＤ−ＲＯＭドライブやＤＶＤ−ＲＯＭドライブ、磁気テープドライブ、メモリカードリーダなどである。記録媒体２０６としては、例えば、ＣＤ−ＲＯＭやＤＶＤ−ＲＯＭ、磁気テープ、ハードディスク、フラッシュメモリなどである。ＣＰＵ２０１は、サーバ装置２０の全体の制御を司り、記憶装置２０３に記憶されているプログラムをメモリ２０２に読み出して実行することにより各種の機能を実現する。通信インタフェース２０５は、通信ネットワーク３０に接続するためのインタフェースである。通信インタフェース２０５としては、例えば、公衆電話回線に接続するモデムや、イーサネット（登録商標）アダプタなどがある。
【００１４】
なお、サーバ装置２０は、複数のＣＰＵ２０１を備えるものでもよいし、複数台のコンピュータを接続したクラスタシステムによって実現されていてもよい。
【００１５】
図３にサーバ装置２０において実現されている機能を示している。同図に示すように、サーバ装置２０では、ユーザプログラム実行部２１１、メソッド中止処理部２１２、監視部２１３、コマンド受付部２１４、保護対象設定情報読込部２１５、ログ書き出し部２１６、最大実行時間読込部２１７、メソッド処理情報記憶部２５１、最大実行時間記憶部２５２、スレッド情報記憶部２５３、保護対象クラス記憶部２５４、保護対象処理条件記憶部２５５、中止対象キュー２５６が実現されている。
【００１６】
メソッド処理情報記憶部２５１は、Ｊａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）の仮想マシンにおいて実行されているスレッド毎に、そのスレッドで実行されているメソッドの処理に関する情報を記憶する。図４にメソッド処理情報記憶部２５１の構成を示している。同図に示すように、メソッド処理情報記憶部２５１は、各スレッドを特定する情報（以下、スレッドＩＤという。）に対応付けて、そのスレッドにおいて呼び出されたメソッドに関する情報（以下、メソッド情報という。）のリスト、排他ロックが取得されているオブジェクトを特定するオブジェクトＩＤのリスト（以下、ロック情報という。）、トランザクション処理が開始されたデータベースを特定するデータベース名のリスト（以下、トランザクション情報という。）を記憶している。例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）では、仮想マシンにおいて排他ロックが取得されたオブジェクトが管理されており、その管理対象となるオブジェクトのＩＤのリストが上記ロック情報となる。また、メソッド情報のリストは仮想マシンによって管理されているコールスタックである。トランザクション情報は、コンテナによって管理される。コンテナによってデータベースに対するトランザクションが開始されたときには、そのデータベース名がトランザクション情報に登録され、トランザクションがコミット又はロールバックされたときには、そのデータベース名がトランザクション情報から削除される。サーバ装置２０の各機能部は、メソッド処理情報記憶部２５１を参照することにより、仮想マシンにおいて実行されている各スレッドについて、実行されている一連のメソッドに関するメソッド情報をコールスタックから取得し、現在排他ロックが取得されているかどうかをロック情報から判断し、トランザクション処理が開始されているかどうかをトランザクション情報から判断することができる。
【００１７】
最大実行時間記憶部２５２は、スレッドにおいて実行されるメソッドを特定する情報と、そのメソッドの最大実行時間とを対応付けて記憶する。図５に最大実行時間記憶部２５２の構成を示す。図５に示すように、最大実行時間記憶部２５２には、クラス名やメソッド名などに対する条件と、その条件に合致するメソッドが仮想マシン上で実行される実行時間の最大値（以下、最大実行時間という。）が設定される。最大実行時間には、例えば、秒単位の値が設定される。
【００１８】
最大実行時間読込部２１７は、設定ファイルからメソッドに対する条件や最大実行時間を読み込んで、最大実行時間記憶部２５２に設定する。
【００１９】
スレッド情報記憶部２５３（本発明の「実行開始時刻記憶部」に該当する。）は、スレッドの状態や、そのスレッドにおいて実行されているメソッドのメソッド情報を記憶する。図６にスレッド情報記憶部２５３の構成を示している。同図に示すように、スレッド情報記憶部２５３には、スレッドＩＤに対応付けて、スレッドの状態が記憶され、スレッドにおいて実行されているメソッドのそれぞれについて、メソッド名、メソッドの実行が開始された時刻、及びそのメソッドに設定された最大実行時間が記憶されている。スレッドの状態には、スレッドが通常実行されている状態を示す「実行中」、スレッドにおいて実行中のメソッドがタイムアウトしたことを示す「タイムアウト」、後述するメソッドの中止処理が実行中であることを示す「中止処理中」、メソッドの中止処理が完了したことを示す「中止完了」などがある。
【００２０】
ユーザプログラム実行部２１１は、アプリケーションサーバにおけるコンテナ機能を提供する。また、ユーザプログラム実行部２１１は、ユーザが記述したプログラム（以下、ユーザプログラムという。）のクラスからオブジェクトを生成したり、生成されたオブジェクトのメソッドを呼び出したりすることにより、ユーザプログラムを実行する。また、ユーザプログラム実行部２１１をＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）クラスとして提供し、例えば、ユーザ定義のクラスの継承元となる基礎クラスとすることもできる。
【００２１】
監視部２１３は、仮想マシンにおいて実行されているスレッドのそれぞれについて、そのスレッドにおいて実行されているメソッドの実行時間が、最大実行時間記憶部２５２に記憶されている最大実行時間を超えていないかどうかを調べることにより、実行中のメソッドのタイムアウトを検出するタイムアウト監視処理を行う。監視部２１３は、独立したスレッドでタイムアウト監視処理を行い、他のスレッドにおいて実行されているメソッドのタイムアウトを検出する。なお、タイムアウト監視処理の詳細については後述する。
【００２２】
コマンド受付部２１４は、利用者から、指定されたスレッドにおいて実行中のメソッドの実行を中止させる処理（以下、メソッド中止処理という。）を行うように指示するコマンド（以下、メソッド中止コマンドという。）の入力を受け付ける。メソッド中止コマンドには、利用者から指定されるスレッドＩＤが設定される。なお、コマンド受付部２１４は、例えば、キーボードやマウスなどの入力装置からメソッド中止コマンドを受け付けるようにしてもよいし、メソッド中止コマンドを含むリクエストをクライアント装置１０から受信するようにしてもよい。
【００２３】
中止対象キュー２５６は、後述のメソッド中止処理部２１２によるメソッド中止処理の対象となるスレッドを特定するスレッドＩＤが登録されるキューである。監視部２１３は、他のスレッドにおいて実行されているメソッドのタイムアウトを検出すると、検出したメソッドが実行されているスレッドのスレッドＩＤを中止対象キュー２５６に登録する。また、コマンド受付部２１４は、メソッド中止コマンドの受付に応じて、メソッド中止コマンドに設定されているスレッドＩＤを中止対象キュー２５６に登録する。
【００２４】
メソッド中止処理部２１２は、中止対象キュー２５６に登録されているスレッドＩＤが示すスレッドにおいて実行されているメソッドを対象としてメソッド中止処理を行う。なお、メソッド中止処理の詳細については後述する。
【００２５】
保護対象クラス記憶部２５４及び保護対象処理条件記憶部２５５（本発明の「保護メソッド記憶部」に該当する。）には、メソッド中止処理部２１２によるメソッド中止処理の対象としない（中止すべきでない）メソッドを特定する情報が記憶される。図７に保護対象クラス記憶部２５４の一例を示す。同図において、保護対象クラス記憶部２５４には、Ｊａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）クラスのパッケージ名やクラス名に対する条件が設定されている。図８は保護対象処理条件記憶部２５５の一例である。同図において、保護対象処理条件記憶部２５５には、メソッドにおいて行われる処理に対する条件が設定されている。保護対象処理条件記憶部２５５に指定される条件の対象となるメソッドの処理とは、メソッド処理情報記憶部２５１に記憶されているコールスタックやロック情報、トランザクション情報から取得可能なものである。上記の条件としては、例えば、特定のメソッドが呼び出されていることや、特定のオブジェクトに対してロックが取得されていること、特定のデータベースに対してトランザクション処理が開始されていることなどがある。保護対象クラス記憶部２５４や保護対象処理条件記憶部２５５に登録されている条件が成立する場合には、後述するように、メソッド中止処理部２１２によるメソッド中止処理は行われない。
【００２６】
保護対象設定情報読込部２１５は、所定の設定ファイルからパッケージ名やクラス名の条件やメソッドの処理内容に対する条件を読み出して、保護対象クラス２５４及び保護対象処理条件記憶部２５５に登録する。図９は、保護対象設定情報読込部２１５が読み出す設定ファイルの内容の一例である。設定ファイルの各行には、上述したパッケージ名やクラス名の条件、メソッドの処理に対する条件などが記述される。なお、設定ファイルにおいて、「＃」で始まる行はコメントである。
【００２７】
ログ書き出し部２１６は、監視部２１３によってスレッドで実行されているメソッドのタイムアウトが検出されたときに、メソッド処理情報記憶部２５１に記憶されているコールスタックやロック情報、トランザクション情報などに格納されているデータをログファイルに書き出す。また、ログ書き出し部２１６は、メソッド中止処理部２１２によってメソッド中止処理が行われた後にも、コールスタックに格納されているデータをログファイルに書き出す。なお、ログ書き出し部２１６は、例えば、サーバ装置２０で実行されるオペレーティングシステムが管理するファイルシステム上のファイルにデータを書き出すようにしてもよいし、ハードディスクや磁気テープ、光磁気ディスク、フラッシュメモリなどの記録媒体に直接データを書き込むようにしてもよい。
【００２８】
なお、上記のユーザプログラム実行部２１１、メソッド中止処理部２１２、監視部２１３、コマンド受付部２１４、保護対象設定情報読込部２１５、ログ書き出し部２１６、及び最大実行時間読込部２１７の各機能部は、サーバ装置２０のＣＰＵ２０１がメモリ２０２に記憶されるプログラム、オブジェクトのメソッド、又はスレッドを実行することにより、あるいは、ハードウェアにより実現される。また、メソッド処理情報記憶部２５１、最大実行時間記憶部２５２、スレッド情報記憶部２５３、保護対象クラス記憶部２５４、保護対象処理条件記憶部２５５、中止対象キュー２５６は、サーバ装置２０のメモリ２０２や記憶装置２０３が提供する記憶領域上に実現される。また、本実施の形態に係る各機能部２１１〜２１７や各記憶部２５１〜２５５、中止対象キュー２５６は、ハードウェアやプログラム、オブジェクト、スレッド、プロセスのいずれでも実現可能である。
【００２９】
図１０は、メソッド中止処理の流れを説明する図である。  
第１のスレッド３１０は、メソッド中止処理部２１２を実現する一連のメソッドを実行し、第２のスレッド３２０は、ユーザプログラム実行部２１１を実現する一連のメソッドを実行する。中止対象キュー２５６に第２のスレッド３２０のスレッドＩＤが登録されると以下のメソッド中止処理が行われる。  
メソッド中止処理部２１２は、中止対象キュー２５６からスレッドＩＤを読み出し（Ｓ３０１）、読み出したスレッドＩＤにより特定される第２のスレッド３２０に対してスレッド中止命令を送信する（Ｓ３０２）。
【００３０】
第２のスレッド３２０はスレッド中止命令の受信に応じて、実行中のメソッドの実行を中止し（Ｓ３０３）、スレッドが中止された旨を示す例外（以下、スレッド中止例外という。）をスローする（Ｓ３０４）。ユーザプログラム実行部２１１は、スレッド中止例外をキャッチし（Ｓ３０５）、中止されたメソッドに続いて実行されるべきメソッドを実行する（Ｓ３０６）。ユーザプログラム実行部２１１は、キャッチしたスレッド中止例外に代えて、一般的なエラーを示す例外（以下、一般例外という。）をスローする（Ｓ３０７）。
【００３１】
上記のように、本実施形態のメソッド中止処理では、第２のスレッド３２０にメソッド中止例外が発生した場合でも、スレッド単位で実行は中止されず、メソッド単位で実行が中止され、中止されたメソッドに後続するメソッドが実行される。したがって、メソッドの実行中又は実行前に、スレッド間の共有資源に対するロックの取得や、データベースに対するトランザクション処理が開始され、実行中のメソッドに後続のメソッドにおいてロックの解除やトランザクション処理のコミット又はロールバックが行われるようになっている場合であっても、実行中のメソッドの実行のみが中止され、後続のメソッドが継続実行される。これにより、ロックが取得されたままになったり、トランザクション処理が開始されたままになったりという状況を回避し、処理の整合性を確保することができる。よって、情報処理システム１全体の信頼性を向上することができる。
【００３２】
図１１は、メソッド中止処理を、アプリケーションサーバのリクエスト処理に適用した具体例を示す図である。同図では、（Ｓ３３６）〜（Ｓ３４０）までの処理が上述したメソッド中止処理に該当する。
【００３３】
サーブレット３２１は、アプリケーションサーバにおいてクライアント装置１０から送信されるＨＴＴＰリクエストを受信するオブジェクトである。コンテナオブジェクト３２２は、第２のスレッド３２０においてユーザプログラム実行部２１１を実現するオブジェクトである。処理オブジェクト３２３は、第２のスレッド３２０においてユーザプログラムのクラスから生成されるオブジェクトである。処理オブジェクト３２３は、例えば、ＥＪＢ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）オブジェクトとして実装される。中止処理オブジェクト３１１は、第１のスレッド３１０においてメソッド中止処理部２１２を実現するオブジェクトである。
【００３４】
サーブレット３２１はＨＴＴＰリクエストに対応する処理を行うリクエスト処理メソッドを有し、第２のスレッドは、サーブレット３２１のリクエスト処理メソッドを実行することにより、一連のメソッドの実行を開始する。処理オブジェクト３２３は処理メソッド２を有しており、コンテナオブジェクト３２２は、処理オブジェクト３２３の処理メソッド２を呼び出す処理メソッド１と、他のスレッドと間の排他ロックを取得する処理を行うロック取得メソッド、上記排他ロックを解除する処理を行うロック解除メソッドを有している。
【００３５】
第２のスレッド３２０は、クライアント装置１０から送信されるＨＴＴＰリクエストに応じて、サーブレット３２１のリクエスト処理メソッドを実行する（Ｓ３３１）。サーブレット３２１は、リクエスト処理メソッドにおいて、コンテナオブジェクト３２２の処理メソッド１を呼び出す（Ｓ３３２）。コンテナオブジェクト３２２は、処理メソッド１からロック取得メソッドを呼び出し（Ｓ３３３）、ロック取得メソッドにおいて排他ロックを取得する処理を行う。コンテナオブジェクト３２２は、排他ロックを取得すると、処理オブジェクト３２３の処理メソッド２を呼び出し（Ｓ３３４）、処理オブジェクト３２３は処理メソッド２を実行する（Ｓ３３５）。
【００３６】
ここで、例えばコマンド受付部２１４がメソッド中止コマンドを受け付けた場合や、後述するように、監視部２１３が処理メソッド２のタイムアウトを検出した場合など、中止対象キュー２５６に第２のスレッドのスレッドＩＤが登録されると、第１のスレッド３１０において中止処理オブジェクト３１１は中止対象キュー２５６から第２のスレッドのスレッドＩＤを読み出し、第２のスレッド３２０に対してスレッド中止命令（例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）ではｓｔｏｐである。）を送信する（Ｓ３３６）。
【００３７】
第２のスレッド３２０は、スレッド中止命令の受信に応じて、スレッド中止例外（例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）では、ＴｈｒｅａｄＤｅａｔｈである。）をスローし、処理オブジェクト３２３は処理メソッド２の実行を中止する（Ｓ３３７）。スレッド中止例外はコンテナオブジェクト３２２に伝播されるが（Ｓ３３８）、コンテナオブジェクト３２２は、スレッド中止例外をキャッチし、処理オブジェクト３２３の処理メソッド２に後続して実行すべきロック解除メソッドを呼び出し（Ｓ３３９）、上記の排他ロックを解除する。コンテナオブジェクト３２２は、キャッチしたスレッド中止例外に代えて、一般例外（例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）では、例えばＲｕｎｔｉｍｅＥｘｃｅｐｔｉｏｎなどである。）をスローする。一般例外はメインオブジェクト３２１に伝播する（Ｓ３４０）。サーブレット３２１は、一般例外をキャッチして例外処理を行い（Ｓ３４１）、ＨＴＴＰリクエストに対する応答を返す（Ｓ３４２）。
【００３８】
以上のように、処理オブジェクト３２３の処理メソッド２に後続して実行すべき、コンテナオブジェクト３２２のロック解除メソッドが実行されるので、排他ロックが取得されたままになってしまうような状況を回避し、他に実行されているスレッドとの間で処理の整合性を確保することができる。
【００３９】
また、スレッド中止命令に応じて第２のスレッド３２０全体の実行が中止してしまうようなことがないので、サーブレット３２１は、例外処理によって処理メソッド２の実行でエラーが起こった旨の応答を返すことができる。つまり、リクエストに対する応答を確実に返すようにすることができる。
【００４０】
また、第２のスレッド３２０は継続して実行されるため、再度第２のスレッド３２０を起動する必要がなく、後続するクライアント装置１０からのリクエストに対しても迅速に応答することができる。よって、情報処理システム１の応答性を高めることができる。
【００４１】
次に、上述したメソッド中止処理を行う契機となる、メソッドのタイムアウト監視処理について説明する。図１２は、タイムアウト監視処理の流れを説明するための図である。監視部２１３は、スレッド情報記憶部２５３に記憶されている全てのスレッドのそれぞれを調査対象スレッドとして、図１２に示す処理を行う。
【００４２】
監視部２１３は、スレッド情報記憶部２５３を参照して、調査対象スレッドのスレッドＩＤ（以下、調査対象ＩＤという。）に対応するスレッドの状態が「タイムアウト」であるかどうかを判断する（Ｓ４０１）。スレッドの状態が「タイムアウト」である場合（Ｓ４０１：ＹＥＳ）、監視部２１３は処理を終了する。
【００４３】
スレッドの状態が「タイムアウト」でない場合（Ｓ４０１：ＮＯ）、監視部２１３は、調査対象ＩＤに対応するメソッド処理情報記憶部２５１のコールスタックから、調査対象スレッドが実行中であるメソッドのメソッド名を読み出し、読み出したメソッド名と調査対象ＩＤとに対応する開始時刻と最大実行時間とをスレッド情報記憶部２５３から読み出す。メソッドの開始時刻に最大実行時間を加えた時刻が現在時刻を超えている場合（Ｓ４０２：ＹＥＳ）、すなわちメソッドの開始時刻から現在時刻までの実行時間（実効時間算出部）が最大実行時間を超えてタイムアウトしていない場合、監視部２１３は処理を終了する。
【００４４】
一方、メソッドの開始時刻に最大実行時間を加えた時刻が現在時刻を超えず、メソッドの実行がタイムアウトした場合（Ｓ４０２：ＮＯ）、監視部２１３は、調査対象ＩＤに対応するスレッド情報記憶部２５３のスレッドの状態を「タイムアウト」に設定し（Ｓ４０３）、調査対象ＩＤを中止対象キュー２５６に登録する（Ｓ４０４）。
【００４５】
中止対象キュー２５６にスレッドＩＤが登録されると、メソッド中止処理部２１２により上述したメソッド中止処理が行われる。図１３〜１５は、メソッドの実行時間がタイムアウトしたときに行われる上述したメソッド中止処理のうち、図１０の（Ｓ３０１）〜（Ｓ３０２）に対応する処理の詳細を説明するための図である。
【００４６】
図１３に示すように、メソッド中止処理部２１２は、中止対象キュー２５６に登録されているスレッドＩＤを読み出し（Ｓ４２１）、スレッド情報記憶部２５３に記憶されている、読み出したスレッドＩＤ（以下、中止対象ＩＤという。）に対応するスレッドの状態が「タイムアウト」であるかどうかを判断する（Ｓ４２２）。スレッドの状態が「タイムアウト」でなければ（Ｓ４２２：ＮＯ）、メソッド中止処理部２１２は処理を終了する。
【００４７】
スレッドの状態が「タイムアウト」である場合（Ｓ４２２）、メソッド中止処理部２１２は、中止対象ＩＤに対応するスレッド情報記憶部２５３のスレッドの状態を「中止処理中」に設定し（Ｓ４２３）、ログ書き出し部２１６は、中止対象ＩＤに対応するメソッド処理情報記憶部２５１のコールスタックから、中止対象ＩＤにより識別されるスレッド（以下、中止対象スレッドという。）が実行中であったメソッド（以下、中止対象メソッドという。）に関するデータを読み出してログファイルに書き出す（Ｓ４２４）。メソッド中止処理部２１２は、図１４に示す処理により中止対象メソッドを中止する（Ｓ４２５）。
【００４８】
図１４に示すように、メソッド中止処理部２１２は、中止対象スレッドに一時停止命令（例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）ではｓｕｓｐｅｎｄである。）を送信し、中止対象スレッドを一時停止させる（Ｓ４４１）。メソッド中止処理部２１２は、メソッド処理情報記憶部２５１の中止対象ＩＤに対応するコールスタックから、中止対象スレッドが実行中であったメソッドのメソッド名を取得し、このメソッドが保護対象として設定されているかどうかを、図１５に示す処理により判定する（Ｓ４４２）（保護判断部）。
【００４９】
図１５に示すように、メソッド中止処理部２１２は、中止対象メソッドのメソッド名又は、中止対象メソッドが属するクラスのクラス名が、保護対象クラス記憶部２５４に登録されているかどうかを判断する（Ｓ４６１）。メソッド名又はクラス名が登録されていない場合（Ｓ４６１：ＮＯ）、メソッド中止処理部２１２は、メソッド処理情報記憶部２５１の中止対象ＩＤに対応するコールスタックから中止対象メソッドに関するデータを読み出す（Ｓ４６２）。メソッド中止処理部２１２は、読み出した中止対象メソッドに関するデータが、保護対象処理条件記憶部２５５に記憶されている各条件に合致するかどうかを判断し（Ｓ４６３）、条件に合致しない場合（Ｓ４６３：ＮＯ）、中止対象メソッドは保護対象になっていないと判定する（Ｓ４６４）。
【００５０】
一方、中止対象メソッドのメソッド名又はクラス名が保護対象クラス記憶部２５４に記憶されている場合（Ｓ４６１：ＹＥＳ）、又は、コールスタックから読み出した中止対象メソッドに関するデータが、保護対象処理条件記憶部２５５に記憶されている条件のいずれかに合致する場合（Ｓ４６３：ＹＥＳ）には、メソッド中止処理部２１２は、中止対象メソッドは保護対象となっていると判定する（Ｓ４６５）。
【００５１】
中止対象メソッドが保護対象である場合（図１４；Ｓ４４３：ＹＥＳ）、メソッド中止処理部２１２は、中止対象スレッドに対して一時停止解除命令（例えばＪａｖａ（サン・マイクロシステムズ・インコーポレーテッドの商標又は登録商標）ではｒｅｓｕｍｅである。）を送信し、中止対象スレッドの一時停止を解除する（Ｓ４４４）。メソッド中止処理部２１２は、中止対象ＩＤに対応するスレッド情報記憶部２５３のスレッドの状態を「タイムアウト」に戻して（Ｓ４４５）、処理を終了する。
【００５２】
中止対象メソッドが保護対象でない場合（Ｓ４４３：ＮＯ）、メソッド中止処理部２１２は、中止対象スレッドに対してスレッド中止命令を送信する（Ｓ４４６）。ログ書き出し部２１６は、中止対象ＩＤに対応するメソッド処理情報記憶部２５１のコールスタックから、中止対象スレッドに関する情報を読み出して、ログファイルに書き出す（Ｓ４４７）。メソッド中止処理部２１２は、中止対象スレッドに対して一時停止解除命令を送信して、中止対象スレッドの一時停止を解除し（Ｓ４４８）、中止対象ＩＤに対応するスレッド情報記憶部２５３のスレッドの状態を「中止完了」に設定する（Ｓ４４９）。
【００５３】
図１６は、メソッドの実行時間がタイムアウトしたときに行われる上述したメソッド中止処理のうち、図１０の（Ｓ３０３）〜（Ｓ３０８）に対応する処理の詳細を説明するための図である。
【００５４】
中止対象スレッドにおいてスレッド中止例外が発生すると（Ｓ４８１）、ユーザプログラムのオブジェクト（以下、ユーザオブジェクトという。）にスレッド中止例外が伝播し、ユーザオブジェクトはメソッドの実行を中止する（Ｓ４８２）。続いて、ユーザプログラムを実行しているユーザプログラム実行部２１１にスレッド中止例外が伝播するが、ユーザプログラム実行部２１１はスレッド中止例外を捕捉する（Ｓ４８３）。ユーザプログラム実行部２１１は、スレッド中止例外を捕捉すると、例えば、ロックの解除やデータベースに対するトランザクションのロールバックなどの後処理を行い（Ｓ４８４）、一般的なエラーを示す例外を発生させる（Ｓ４８５）。また、ユーザプログラム実行部２１１は、ユーザプログラム実行部２１１が実行されているスレッドのスレッドＩＤに対応するスレッド情報記憶部２５３のスレッドの状態を「実行中」に設定する（Ｓ４８６）。
【００５５】
このようにして、スレッドで発生したスレッド中止例外は、ユーザプログラム実行部２１１によって捕捉され、ロックの解除やトランザクションのロールバックなどの後処理の上、一般的なエラーを示す例外が発生される。したがって、ユーザオブジェクトのメソッドが中断されても、ユーザプログラム実行部２１１によって後処理が行われるため、スレッド間におけるデッドロックやデータの不整合などを防ぐことができる。よって、情報処理システム１の信頼性を高めることができる。また、スレッド自体の処理は継続されるため、再度スレッドを起動する必要がない。したがって、スレッドの起動にかかる処理負荷を低減し、情報処理システム１全体の処理効率を高めることができる。
【００５６】
また、本実施形態のサーバ装置２０では、所定時間内にメソッドの処理が終了しない場合にそのメソッドの実行を中止する。したがって、例えば無限ループなどにより、システムのＣＰＵ資源を消費して情報処理システム１全体の負荷を上げてしまうような処理を行っているメソッドが存在する場合に、所定時間経過後にそのメソッドを中止するようにすることができる。これにより、無限ループなどによりサーバ装置２０の処理負荷が増加してしまう時間を所定時間に限り、高負荷な状態が続くことを回避することができる。よって、情報処理システム１全体としての処理効率を高めることができる。
【００５７】
また、本実施形態のサーバ装置２０では、クラス名やメソッド名、メソッドにおいて行われる処理の条件などによって、保護対象となるメソッドを設定しておくことで、保護対象として設定されているメソッドの実行は中止しないようにすることができる。したがって、より柔軟な運用が可能となる。例えば、コンテナの機能を利用しない排他制御を行うユーザプログラムを開発する場合には、排他ロックの取得から解除までの間に実行されるメソッドを保護対象として設定しておくことにより、ロックが取得されたままになる状態やデッドロックなどを回避することができる。これにより、情報処理システム１全体の信頼性を向上することができる。
【００５８】
また、本実施形態では、メソッドの実行時間がタイムアウトした時と、メソッドが中止された時の２度、コールスタックやログ情報、トランザクション情報などの内容がログファイルに書き出される。したがって、ユーザプログラムの開発者は、これらのログファイルを比較することにより、実行時間がタイムアウトした時のスレッドの状態と、メソッドの実行が中止された後のスレッドの状態とを詳細に比較することができる。これにより、開発者は、例えば、再帰的なメソッドの呼び出し、異常な変数の値、不正なアドレスに対するアクセスなどを容易に把握することができる。したがって、開発者はバグの原因を容易に調査することが可能となる。また、例えば、ユーザプログラムの開発時におけるテストに応用することで、効果的かつ効率的なテストを行うこともできる。
【００５９】
以上、本実施形態について説明したが、上記実施形態は本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明は、その趣旨を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物も含まれる。
【図面の簡単な説明】
【００６０】
【図１】本発明の一実施の形態による、本実施形態に係る情報処理システム１の全体構成を示す図である。
【図２】本発明の一実施の形態による、サーバ装置２０のハードウェア構成の一例を示す図である。
【図３】本発明の一実施の形態による、サーバ装置２０の機能ブロック図である。
【図４】本発明の一実施の形態による、メソッド処理情報記憶部２５１の構成例を示す図である。
【図５】本発明の一実施の形態による、最大実行時間記憶部２５２の構成例を示す図である。
【図６】本発明の一実施の形態による、スレッド情報記憶部２５３の構成例を示す図である。
【図７】本発明の一実施の形態による、保護対象クラス記憶部２５４の一例を示す図である。
【図８】本発明の一実施の形態による、保護対象処理条件記憶部２５５の一例を示す図である。
【図９】本発明の一実施の形態による、保護対象設定情報読込部２１５が読み出す設定ファイルの内容の一例を示す図である。
【図１０】本発明の一実施の形態による、メソッド中止処理の流れを説明するための図である。
【図１１】本発明の一実施の形態による、メソッド中止処理の流れの具体例を示す図である。
【図１２】本発明の一実施の形態による、タイムアウト監視処理の流れを説明するための図である。
【図１３】本発明の一実施の形態による、メソッド中止処理の流れを説明するための図である。
【図１４】本発明の一実施の形態による、メソッド中止処理の流れを説明するための図である。
【図１５】本発明の一実施の形態による、メソッドが保護対象となっているかどうかを判定する処理の流れを示す図である。
【図１６】本発明の一実施の形態による、スレッド中止例外が発生したときの処理の流れを示す図である。
【符号の説明】
【００６１】
１０    クライアント装置
２０    サーバ装置
３０    通信ネットワーク
２０１  ＣＰＵ
２０２  メモリ
２０３  記憶装置
２０４  記憶媒体読取装置
２０５  通信インタフェース
２１１  ユーザプログラム実行部
２１２  メソッド中止処理部
２１３  監視部
２１４  コマンド受付部
２１５  保護対象設定情報読込部
２１６  ログ書き出し部
２１７  最大実行時間読込部
２５１  メソッド処理情報記憶部
２５２  最大実行時間記憶部
２５３  スレッド情報記憶部
２５４  保護対象クラス記憶部
２５５  保護対象処理条件記憶部
２５６  中止対象キュー
【図１】
2006146678.tif 000003
【図２】
2006146678.tif 000004
【図３】
2006146678.tif 000005
【図４】
2006146678.tif 000006
【図５】
2006146678.tif 000007
【図６】
2006146678.tif 000008
【図７】
2006146678.tif 000009
【図８】
2006146678.tif 000010
【図９】
2006146678.tif 000011
【図１０】
2006146678.tif 000012
【図１１】
2006146678.tif 000013
【図１２】
2006146678.tif 000014
【図１３】
2006146678.tif 000015
【図１４】
2006146678.tif 000016
【図１５】
2006146678.tif 000017
【図１６】
2006146678.tif 000018