(実施例1)
本実施例では、複数のデータ変換フィルターを用いたデータ変換の内、少なくとも一つのデータ変換処理を構成するコンポーネントを別プロセスとして起動し、実行する方法について説明する。
データ変換処理を構成する各コンポーネントを別プロセスとして起動することにより、クラッシュやハングアップが発生したとしても、システムを巻き込むことがなくなる。そのため、システムを再起動するための特別なソフトウェアも不要となる。図1は、複数の情報処理装置から構成される、本実施例におけるクラウドプリントサービスのシステム構成図である。クラウドプリントサービスとは、クライアントコンピュータなどの端末機器からの依頼に応じて、サーバー上のデータ変換サービスの変換により印刷用の画像データを生成するサービスである。生成された印刷用の画像データは、ネットワーク接続されたプリンターに出力され、印刷される。
印刷データの変換を依頼する依頼者101は、印刷データの変換要求を送出する機器として、パーソナルコンピュータ102、タブレットPC103や携帯端末104などの機器を利用する。これらの機器は、依頼者101からの操作を受け付け、ネットワーク105上のサーバーに存在する印刷データ変換サービスに対して印刷データの変換を依頼する。印刷データ変換サービスはサーバーPC106上で特定のURLを公開しているWebサービスとして動作しているプログラムである。サーバーPC106上では前記URLに対して到着した依頼を印刷データ変換サービスに転送するWebサーバーも動作している。一般的にURLへ到着する依頼は通常多数になるため、単一のサーバーPC106では処理させず、複数のサーバーPC106に処理させる構成になる。従って、複数のサーバーPC106の前段にロードバランサー107を設置し、サーバーPC106それぞれに転送される依頼が均一に配分されるように構成する。
印刷データ変換サービスが提供するサービスは、依頼者101から受け付けたデータをプリンター108で印刷できる形式に変換することである。依頼者101から受け付けるデータにはドキュメント、画像ファイルなど各種のアプリケーションプログラムで作成されたフォーマットが存在する。一方、プリンター108が印刷データとして受け付けるデータは前述のフォーマットとは異なり、PDL(Page Description Language)で記述されたデータや、印刷部数等の印刷を制御するための印刷用の画像データとなっている。このように、依頼者101とプリンター108の間には扱うデータ形式の差異が存在する為に、その差異を埋めるプログラムが必要とされる。通常この変換処理を行うのがプリンタードライバーと呼ばれるプログラムである。プリンタードライバーは依頼者101が操作する前述のアプリケーションプログラムが動作しているPC上で動作させることが通常である。しかし、プリンタードライバーの処理は、CPU、メモリなどのリソースを多く必要とする重い処理であるため、依頼者101の操作するPCの保持するリソースが少ない場合には印刷処理が実用的でなくなる程時間のかかる処理になってしまう。タブレットPC103や携帯端末104といった、リソースの比較的少ない端末からの印刷の需要が高まるにつれプリンタードライバーの処理をインターネット上のサーバーサービスで行わせることの重要性が増している。
前述のパーソナルコンピュータ102、タブレットPC103、携帯端末104は、依頼者101からの指示を受け付け、前述のURLに対して印刷データをプリンター108で印刷できる形式に変換するように依頼を行う。依頼に応じてサーバーPC106上で動作している印刷データ変換サービスが生成した変換後のデータは前述の端末に対して返送される。依頼者101から受け付ける指示によっては変換後のデータは印刷データ変換サービスがアクセス可能なファイルサーバPC109で保管される場合もある。
<ハードウェア構成>
図2は印刷データ変換サービスをはじめとするソフトウェア群が動作するサーバーPC106のハードウェア構成図である。
印刷データ変換サービスはOS(オペレーティングシステム)上で動作するアプリケーションプログラムであり、HDD202あるいはROM203に格納されている。CPU205がOSとアプリケーションプログラムをHDD202あるいはROM203から読み出してRAM204にロードし、実行することで様々な処理が進行し印刷データ変換サービスとしての機能を実現する。処理結果はファイルとしてHDD202に格納され、あるいはデータとしてRAM204に記憶される。アプリケーションプログラムはコンピュータに接続されている入力装置207から使用者の入力、各種センサの読み取り値を取得する。さらに、出力装置206に対して情報を出力し、処理結果を表示する。さらに、通信装置208を介してネットワークに接続された他のコンピュータや装置と通信を行う。これらのハードウェアはバス201で互いに接続されていてアプリケーションプログラムから操作できるように構成されている。
<ソフトウェア構成>
図3は、印刷データ変換サービス301を含むソフトウェア群がサーバーPC106上でどのように構成されているかを示すブロック図である。Webサーバー302は依頼者101が操作したパーソナルコンピュータ102上のアプリケーションからHTTPプロトコルで送信されたリクエストを受け取る。ロードバランサー107はWebサーバー302の前段に位置し、Webサーバー302の処理負荷などに基づいて、複数のサーバーPC106上で動作しているWebサーバー302それぞれに対して受け取ったリクエストを振り分ける。この振り分ける方式は種々知られているが、ここでは説明を省略する。
ここで、サーバーPC106は必ずしも物理的な一台のサーバーPCを意味する必要はない。現時点で単一のPC上に複数の仮想的なPCを出現させる仮想化技術が一般的となっており、ソフトウェアからみれば自身が動作しているオペレーティングシステムが仮想的に作り出されたものか否かは判別がつかないか、あるいは判別する必要がない。
従って、本実施例におけるサーバーPC106は「場合によっては仮想化されたPC」を意味する場合もある。本記載以降、「PC」という表現は物理的なPCと仮想化されたPCの両方を意味するものとして扱う。
アプリケーションサーバー303は、要求の送付先として指定されたURLを解析し、関連つけられている印刷データ変換サービス301を決定する。印刷データ変換サービス301は、入力データを複数のデータ変換フィルターを用いてデータ変換し、出力用(印刷用)の画像データを生成するサービスである。尚、印刷データ変換サービス301の詳細な処理については、後述する。通常、Webサーバー302とアプリケーションサーバー303は複数種のサービスを扱うことが可能であり、URLから対応するサービスを特定して要求を振り分けることができる。本実施例では、その複数種のサービスの一つが印刷データ変換サービス301である。通常、このサービスの他にもサービスは稼働しているが、本実施例の説明においては、印刷データ変換サービス301以外のサービスは省略する。
印刷データ変換サービス301は、サーバーPC106で動作するOS上のプロセスとして動作する。アプリケーションサーバー303は複数の要求を並列実行させるために、印刷データ変換サービス301を複数起動し、各々に要求を振り分ける。
アプリケーションサーバー303はさらに、依頼者101からの一連の要求を特定する為のセッションを管理する。具体的には、同一の依頼者101からの要求は同一の印刷データ変換サービス301に転送するセッション・アフィニティーを実現している。
<印刷データ変換サービス>
図4は、印刷データ変換サービス301が依頼された印刷データを変換する際に利用するソフトウェアコンポーネント群およびその関連を説明する図である。なお、以下ではプロセスとして起動したコンポーネントのことを「コンポーネントプロセス」と記載する。
印刷データ変換サービス301は、先に説明したようにプロセスとして動作している。
以下に、図4を用いて、印刷データ変換サービス301が利用するソフトウェアコンポーネントそれぞれの概要について説明する。
<ジョブ処理受け付け部401>
ジョブ処理受け付け部401は、データを取得する取得手段として機能し、印刷データ変換サービスから処理対象のデータ一式を受け取るコンポーネントである。この処理対象のデータ一式をジョブと呼ぶ。ジョブは、変換されるべき対象データ(入力データ)と、変換処理用の設定値などをまとまりのある形式に束ねた「チケット」と呼ばれるデータ構造から構成される。尚、ジョブはネットワーク接続されたクライアントコンピュータなどの端末機器から取得されたものである。
ジョブ処理受け付け部401は、後述するジョブ制御部402の代理としてロードされる。そして、受け取ったジョブに基づき、Application Programming Interface(API)で提供している関数群を呼び出すことで変換処理の実行を依頼する。変換処理後、変換処理の実行結果を受領する。
<ジョブ制御部402>
ジョブ制御部402は、ジョブ処理受け付け部401を介してジョブ実行を依頼され、ジョブに含まれている「ジョブ種別情報」をもとに、変換に必要なフィルターを選定するコンポーネントである。ジョブ制御部402は、プロセスとして動作し、ジョブ処理受け付け部401からの変換処理の受付の為の通信インターフェイスを保持している。
この通信インターフェイスへのジョブの依頼はHTTPプロトコルではなく、専用のプロトコルが用いられている。ジョブ処理受け付け部401のAPIを呼び出す行為はジョブ制御部402が用意している変換処理受付用通信インターフェイスへのプロセス間通信として変換される。すなわち、印刷データ変換サービス301にとって変換処理はジョブ処理受け付け部401によって実行されているように見える。しかし、実際にはジョブ制御部402および後述する複数のフィルター群、およびフィルター群が利用するいくつかのコンポーネントの相互作用によって実現されている。
<プロセス情報管理部403>
プロセス情報管理部403は、各コンポーネントをプロセスとして起動する責務を担っているコンポーネントである。プロセスの起動は、起動可能なプロセス数、プロセスごとの常時起動の要否などからなるプロセス起動条件に基づき行われる。よって、プロセス情報管理部403は、プロセスの起動条件を取得する起動条件取得手段およびプロセスを起動させる起動手段として機能する。さらに、他のコンポーネントからの求めに応じて別のコンポーネントのエンドポイントを返すという機能を提供する。エンドポイントとはTCP/IPのリスンポートを指す。あるコンポーネントは別のコンポーネントが公開しているエンドポイントを取得し、そのエンドポイントにアクセスすることでそのコンポーネントが提供するサービスを利用することができる。あるコンポーネントが他のコンポーネントのエンドポイントをプロセス情報管理部403に対して問い合わせる動作を“クエリー”と呼ぶ。
図4に示したように、複数種類のコンポーネントがプロセスとして複数存在し、かつ同一コンポーネントも同一PC上に複数存在する。従って、各コンポーネントが公開するサービスI/Fのポート番号は固定にすることができず、自ずと動的に生成せざるを得なくなる。動的に生成されたエンドポイントは何らかの管理機構が無くては他から参照することはできない。この管理を担当するのがプロセス情報管理部403である。さらに、コンポーネントが、他のコンポーネントが動的に生成したエンドポイントを取得する手段が必要である。この手段がクエリーである。
例えば、ログ出力部408は、ロギングデータをログファイルとして記録するサービスを提供し、ジョブ処理受け付け部401、ジョブ制御部402、フィルター制御部404は、このサービスを利用するためにログ出力部408のクエリーを行う。同様に、ジョブ処理受け付け部401はジョブ制御部402をクエリーし、ジョブ制御部402はフィルターA405、フィルターB406、フィルターC407をクエリーする。クエリーの処理の流れは、図7、図10を用いて後述する。
プロセス情報管理部403はアプリケーションサーバー303が起動した時点で唯一起動している特殊なプロセスである。サーバーPC106上で動作しているオペレーティングシステム(OS)を設定し、OS起動時に自動的にプロセス情報管理部403のプロセスを起動するようにする。
<フィルター制御部404>
フィルター制御部404は、プロセスとして動作し、実行時に指定されたデータ変換用のフィルターをロードするコンポーネントである。データ変換用のフィルターは、データ変換処理のみを実装したライブラリーモジュールの形式で用意されている。フィルター制御部404はコントロールバス410への接続とメッセージ送受信、ジョブ制御部402との通信、フィルターのログ出力のログ出力部408への転送などの処理を担当する。
フィルター制御部404は、第一のデータ変換フィルターとして機能するフィルターA405、第二の変換フィルターとして機能するフィルターB406、第三の変換フィルターとして機能するフィルターC407のデータ変換を制御する。第一のデータ変換フィルターのデータ変換により生成された中間データは、第二のデータ変換フィルターによりデータ変換され、第二のデータ変換フィルターのデータ変換により生成された中間データは、第三のデータ変換フィルターによりデータ変換される。フィルター制御部404のデータ変換により生成されたデータは、印刷用の画像データとなる。
<ログ出力部408>
ログ出力部408は、各コンポーネントがネットワークを介して送信したログを取得し、取得したログを蓄積するコンポーネントである。ログ出力部408は、プロセスとしてコントロールバス410上に最低一つは存在する。各コンポーネントはログデータをログ出力部408に対してネットワークを介して送信し、ログ出力部408が一定量のログデータが蓄積した時点でログファイルに出力する。ログデータを蓄積せずに逐次ログファイルに出力するようにしてもよい。
ログファイルの出力パス等の設定はログ出力部408が起動される際に渡されるコンフィギュレーションファイルで指定される。コントロールバス410上のコンポーネントはジョブの実行中にログ出力を行うが、それぞれのコンポーネントで個別にログ出力部を持ってしまうと、ログファイルがコンポーネントごとに分かれてしまい、ログの解析が困難となってしまう。そこで、本実施例では、ログ出力部408が一括してログファイルへの出力を行うようにしている。
<コントロールバス>
コントロールバス410は、上記の各コンポーネント間の通信チャネルである。このチャネルには、例えば、クエリー要求、クエリー要求に対するレスポンス、ハートビート、コンポーネントプロセスの状態変更通知などのメッセージが流れる。
コントロールバス410は、マルチキャスト通信を利用する。各コンポーネントプロセスは、同一のマルチキャスト用アドレスおよびポートを指定してコントロールバスに参加する。コントロールバスに参加しているコンポーネントがメッセージを流すと、参加している全コンポーネントプロセスにメッセージが届けられる。
<データ変換処理の概要>
次に、本実施例におけるデータ変換処理の概要について説明する。
まず、ジョブ処理受け付け部401を介してジョブ実行を依頼されたジョブ制御部402は、ジョブに含まれている「ジョブ種別情報」をもとに、変換に必要なフィルターを選定する。必要なフィルターの組み合わせとその並び順は、例えば設定ファイルとしてジョブ制御部402で保持する。
図5は、必要なフィルターの組み合わせとその並び順を記載するための設定ファイルの例である。要素501はジョブ種別情報を記載するための要素である。id属性でジョブ種別情報を指定する。要素群502はフィルターの組み合わせと並び順を記載するための要素である。name属性でフィルターの種類を記載し、version属性でどのバージョンのフィルターを使うのかを記載する。要素群502は、要素の記載順でフィルターの並び順を規定する。要素群502の例では、フィルターA、フィルターB、フィルターCの順で処理が行われる。ジョブ制御部402は、ジョブに含まれているジョブ種別情報と一致する要素501を探索し、一致する要素501の下に書かれているフィルターの組み合わせと並び順を採用する。
なお、必要なフィルターの組み合わせとその並び順は、ジョブ種別情報の代わりに、印刷データを解析して決定するようにしてもよい。その場合、印刷データの先頭から既定のサイズを読出しその中に含まれている特徴的な内容から印刷データの種類を判定する。
例えば、JPEG形式や、PDF(Portable Document Format)形式のデータなどが入力データとして与えられる。次に、ジョブに含まれている変換先の印刷データ形式を取得し、変換元の印刷データ形式と変換先の印刷データ形式の両者が確定した時点で、この変換に必要なフィルター群を選定する。
必要な複数のフィルターを選定したあとはこれらフィルターをロードしているフィルター制御部404を取得する。図4の例では変換に必要なフィルターとして、フィルターA405、フィルターB406、フィルターC407が必要であり、それらはそれぞれフィルター制御部404にロードされている。
ジョブ制御部402はフィルターA405、フィルターB406、フィルターC407との間で、パイプライン409と呼ばれるデータ転送チャネルを作成する。プロトコルとしては例えばTCP/IPを用いる。パイプライン409は片方向にのみデータを転送する。ジョブ制御部402、フィルターA405、フィルターB406、フィルターC407、ジョブ制御部402と一周するようにパイプライン409が構成される。また、ジョブ制御部402はジョブ処理受け付け部401との間にもパイプライン409を作成する。このようにパイプライン409を作成することで、ジョブ処理受け付け部401から印刷データが複数のコンポーネントを還流し、最後に変換が終了した形で再びジョブ処理受け付け部401に戻ってくる。以上が、本実施例におけるデータ変換処理の概要である。
<データ変換処理フロー>
続けて、図6を用いて、データ変換処理の具体的な処理フローを説明する。
図6は、ジョブ処理受け付け部401が印刷データ変換サービス301からジョブ処理を受け付けた後の、データ変換処理の概要を示したシーケンス図である。
S601は、ジョブ処理受け付け部401がジョブ制御部402のクエリー要求を行う処理である。ジョブ処理受け付け部401は、プロセス情報管理部403にクエリー要求を行い、ジョブ制御部402のエンドポイントを取得する。クエリーの処理の流れは図7、図10を用いて後述する。
S602は、ジョブ処理受け付け部401がジョブ制御部402に対してジョブ処理依頼を行う処理である。ここで、ジョブのデータが、ジョブ処理受け付け部401からジョブ制御部402に渡される。ジョブのデータは、前述の通り、変換されるべき対象データ(入力データ)と、変換処理用の設定値などをまとまりのある形式に束ねた「チケット」と呼ばれるデータ構造から構成される。尚、本実施例における入力データは、例えば、ワードプロセッシング用のアプリケーションにより作成された文書データや、ドローイングソフトによって作成された画像データなどである。
受け渡しには、ジョブのデータのパスで渡すようにしても良いし、メモリやプロセス間通信で渡すようにしてもよい。
S603は、ジョブ制御部402が、ジョブの内容をもとに、フィルターの種類、並び順を決定し、それらフィルターのクエリー要求を行う処理である。フィルターの種類、並び順に関しては、図5を用いて説明済みである。ジョブ制御部402は、プロセス情報管理部403に対して、各フィルターに対応するフィルター制御部404のクエリー要求を行い、それぞれのエンドポイントを取得する。ここでは、フィルターA405、フィルターB406、フィルターC407の順に処理を行うと決定したものとして説明をする。尚、図4に示したように、フィルターA405、フィルターB406、フィルターC407それぞれのデータ変換処理は、互いに異なるプロセスのフィルター制御部によって処理される。互いに異なるプロセスで処理されることによって、一つのデータ変換フィルターの不具合がデータ変換フィルター全体に波及することを防止することが出来る。
S604は、パイプラインを生成する処理である。ジョブ制御部402は、各フィルター制御部404に対してパイプラインの生成を指示する。各フィルター制御部404は、それぞれ隣り合うコンポーネントプロセスとのパイプラインを生成する。パイプライン生成を完了した後、各フィルター制御部404はジョブ制御部402にパイプライン生成完了を通知し、各フィルター制御部404への入力パイプラインからジョブが流れてくるのを待機する。なお、ジョブ制御部402は、各フィルター制御部404に対してパイプラインの生成を指示する際に、ジョブ制御部402のサービスIFのエンドポイントも各フィルター制御部404に通知する。フィルター制御部404はエラーが起こった際に、このジョブ制御部402のサービスIFを通じて、ジョブ制御部402にエラーを通知する。
S605は、データ変換処理である。ジョブ制御部402は、ジョブのデータに含まれる入力データを取得する取得手段として機能し、初段のフィルター制御部404に接続されているパイプラインに入力データを送信する。フィルターA405(第一のデータ変換フィルター)は、フィルター制御部404を通じてデータを受け取り、データ変換処理を第一のプロセスで行う。そして、フィルターA405は、フィルター制御部404を通じて、フィルターB406(第二のデータ変換フィルター)と接続されているパイプラインにデータ(中間データ)を流す。フィルターB406、フィルターC407でも同様に、第一のプロセスとは異なる第二のプロセス、第二のプロセスでデータ変換処理が行われる。ここで、各フィルター群は、データ変換を行う変換手段として機能している。最終的に、フィルターC407から、フィルター制御部404を通じて、ジョブ制御部402に生成された変換後のデータが出力用の画像データとして送信される。ここで、出力用の画像データとは、例えば、プリンターなどで印刷可能な印刷用のビットマップデータなどである。
S606は、ジョブ制御部402が、ジョブ処理受け付け部401に対して変換後のデータを返却する処理である。
<コンポーネントの生成>
ここでは、コンポーネントの生成について説明する。図7はコンポーネントをプロセスとして生成するシーケンスを説明した図である。
図7(A)ではプロセス情報管理部403のみが存在する状況である。この状況は図3においてサーバーPC106が起動した直後に相当する。この時点ではまだ印刷データ変換サービス301は起動していない想定である。プロセス情報管理部403は単独でコントロールバス410に参加している状態である。
プロセス情報管理部403はサービスカタログ701を保持している。サービスカタログ701とは、サーバーPC106上にインストールされているコンポーネントのリストから構成されているカタログである。サービスカタログ701は、例えば、サーバーPC106のHDD202にファイルとして保存され、プロセス情報管理部403によって読み込まれる。図8にサービスカタログの概念図を示す。
図8において、エントリー801は、サービスカタログのエントリーであり、コンポーネントごとに存在する。
コンポーネント名802は当該エントリーのコンポーネント名である。
サービスのバージョン803は、コンポーネントのバージョンを示す。同一の名前を持つコンポーネントであっても、そのバージョンが異なれば異なる機能を提供するためサービスカタログ701上では異なるエントリーとして扱われる。
実行ファイルパス804は、コンポーネントの実行ファイルパスを示す。
コンフィギュレーションファイルパス805は、コンポーネントをプロセスとして起動したときに、プロセス情報管理部403からそのコンポーネントに渡されるコンフィギュレーションファイルのパスである。
コンポーネントの終了条件806は、そのコンポーネントのプロセスが終了するための条件を示す。条件は時間やジョブ数で記述する。プロセス情報管理部403は、終了条件806の内容を起動したコンポーネントプロセスに渡す。終了条件806に関しては図7(J)にて後述する。
起動モード807は、コンポーネントプロセスが、オンデマンドで起動するかホットスタンバイさせておくかを示す。起動モード807がOndemandの場合は、そのコンポーネントを指定したコンポーネントのクエリーがあった場合に当該コンポーネントプロセスを起動する。また、HotStandbyの場合はプロセス情報管理部403が起動する際に当該コンポーネントプロセスを起動する。
最大起動数808は、コンポーネントプロセスが最大何個まで起動できるかを示す。同種のコンポーネントプロセスを複数個起動しておくことで、例えばあるコンポーネントプロセスがクラッシュして再度起動している際に、同種の別のコンポーネントプロセスが処理を受け付けることが可能となる。なお、あるコンポーネントについて、起動モード807がHotStandbyの場合には、プロセス情報管理部403が起動する際に、最大起動数808分だけのコンポーネントプロセスを起動する。また、あるコンポーネントの起動モード807がOndemandの場合には、プロセス情報管理部403がクエリーを受け付け時に最大起動数808を超えない場合にコンポーネントプロセスを起動する。
図7(B)では、あるコンポーネントA702の起動モードがホットスタンバイ(HotStandby)に指定されているとした場合の例を示している。プロセス情報管理部403は自身が起動したら、このサービスカタログ701を参照し、起動モードがホットスタンバイに指定されているコンポーネントA702を発見する。次にプロセス情報管理部403は、サービスカタログ701からコンフィギュレーションファイルパス805と終了条件806を取得し、起動引数に与えてコンポーネントA702をプロセスとして起動する。コンポーネントA702は起動し、コントロールバス410に接続する時点でユニークなIDを与えられる。このIDとしては例えばGUID(Globally Unique Identifier)を用いる。コンポーネントA702はコンフィギュレーションファイルパス805からコンフィギュレーションファイル703を参照し、必要な初期値等を取り出し、その初期値を使って自身を初期化する。
図7(C)では、コンポーネントA702はサービスを提供する為に、TCP/IPのポートを取得しサービスI/F704の待ち受けを開始する。コンポーネントA702はこれで他のコンポーネントへのサービスの提供の準備ができたため、コントロールバス410に自身のアドバタイズメッセージ705を作成して送信する。アドバタイズメッセージ705にはコンポーネントA702の名前、ID、バージョン、サービスI/F704のエンドポイント(アドレス、ポート番号)が記載されている。このメッセージがプロセス情報管理部403宛てに送信される。アドバタイズメッセージ705はコンポーネントが自身の起動完了とサービス提供開始を宣言する行為である。このメッセージの受信によってプロセス情報管理部403はコンポーネントA702の起動を確認し、かつサービスI/Fのエンドポイントを取得することができる。
図7(D)は、プロセス情報管理部403がコンポーネントA702からのアドバタイズメッセージ705を受信し、以降の管理の為に管理テーブルであるサービスインベントリー706に登録を行った様子を表している。
図9はサービスインベントリー706の内容を模式的に表した図である。
図9において、エントリー901はサービスインベントリー706のエントリーである。コンポーネントプロセスごとのエントリー901が存在する。プロセス情報管理部403は、アドバタイズメッセージ705を受け取った時点で、サービスインベントリー706内にそのメッセージの送信元であるコンポーネントプロセスのエントリーを作成する。そして、プロセス情報管理部403はそのエントリー内にメッセージの内容を記載する。具体的には、ID902、名前903、バージョン904、エンドポイント905に記載される。
生存時間906は、コンポーネントプロセスが作成されてからの生存時間(秒数)が記録される。この生存時間は後述するハートビートメッセージ707の内容から作成される。
状態907には、プロセス情報管理部403が後述するステートチェンジメッセージを受け取った際にコンポーネントプロセスの状態を記録する。状態907は「アイドリング」「ビジー」「行方不明」という値を取り得る。「アイドリング」は、当該コンポーネントプロセスが処理受け付け可能な状態である。「ビジー」は当該コンポーネントプロセスが処理受け付け不可能な状態である。「行方不明」は当該コンポーネントプロセスが動作しているかどうかが不明な状態である。各コンポーネントプロセスが起動する際には「アイドリング」状態で起動する。「ビジー」状態に関しては図7(H)、「行方不明」状態に関しては図7(E)で後述する。
最終連絡時刻908は、プロセス情報管理部403がコンポーネントプロセスから最後に受け取ったメッセージの受け取り時刻を記録する。この実施例ではオペレーティングシステムから取得したシステム時刻が格納されている。通常、名前とバージョンが同一であるコンポーネントのプロセスは複数生成される。これらのサービスインベントリー706上のエントリー901は少なくとも互いに、IDとPort番号が異なった値になるため識別が可能である。
図7(E)ではコンポーネントA702からハートビートメッセージ707を受け取る状況を説明している。各コンポーネントは定期的にハートビートメッセージ707をプロセス情報管理部403宛てに送信するよう構成する。プロセス情報管理部403はこのメッセージを受け取ることにより送信元コンポーネントの生存を確認し、サービスインベントリー706の生存時間906と最終連絡時刻908を更新する。もし、コンポーネントからのハートビートメッセージ707が既定時間滞ると、プロセス情報管理部403はこのコンポーネントプロセスの状態907を「行方不明」に変更する。この状態でさらに既定時間ハートビートメッセージが滞ると、そのコンポーネントプロセスは自動的にサービスインベントリー706上からエントリーごと削除される。サービスインベントリー706上から削除されたコンポーネントプロセスはもはや他のコンポーネントからのクエリーに対して検索されなくなり、以てサービスを提供できなくなる。エントリーの削除は対象コンポーネントプロセスのIDを基に行われるため同一名称の他のコンポーネントプロセスのエントリーには影響を与えない。
図7(F)はコンポーネントA702がコンポーネントB709を利用しようとしてプロセス情報管理部403に対してクエリーメッセージ708を送信した様子である。このクエリーメッセージ708にはコンポーネントB709の名前と利用したいバージョンが記されている。あるコンポーネントは複数のバージョンが作成され得る。同一の名前のコンポーネントが機能の違いにより複数作成されて異なるバージョンとして市場にリリースされる。従ってコンポーネントA702はバージョン“2.0.0.1”の様に自分が利用したいコンポーネントB709のバージョンを指定してクエリーを行うことができる。もし、特定バージョンを利用する必要が無いならばバージョン欄は空で指定する。図7(F)の時点ではコンポーネントB709はまだ生成されていない為、プロセス情報管理部403はコンポーネントB709を新たに生成する。図7(B)〜(D)で示したコンポーネントA702の生成手順と同じようにコンポーネントB709が生成される。プロセス情報管理部403におけるクエリーの処理の詳細は図10を用いて後述する。
図7(G)はプロセス情報管理部403がクエリーに対するレスポンスをコンポーネントA702にクエリーレスポンスメッセージ710として返却する様子である。クエリーレスポンスメッセージ710にはコンポーネントB709の名前、バージョン、サービスI/Fを示すエンドポイントが格納されている。
図7(H)はクエリーレスポンスメッセージ710を受け取ったコンポーネントA702が取得したコンポーネントB709のサービスI/F711を利用する様子である。コンポーネントによってはサービスI/Fにアクセスして来る他のサービスからのサービス要求を同時に扱えるものとそうでないものが存在する。例えば、ログ出力部408は複数のサービスからのロギングデータを同時並行的に受け取りログファイルに記録していく能力を有する。一方、パイプラインを構成してジョブを変換するフィルターは同時並行処理の能力をもたない。従って、コンポーネントB709が同時並行処理能力を持たないコンポーネントであるとすると、コンポーネントA702がアクセスしてきた時点で他のコンポーネントからの要求を受け付けられない状態すなわちビジー状態に遷移する。この状態はコンポーネントA702が明示的なアクセス終了をサービスI/Fを通じてコンポーネントB709に宣言するまで継続する。コンポーネントB709はビジー状態に遷移したら、自身をクエリーで検出されないようにするため、図7(I)に示すようにステートチェンジメッセージ712をプロセス情報管理部403に対して送信する。ステートチェンジメッセージ712にはコンポーネントB709がビジー状態に遷移したことが記されている。このメッセージを受け取ったプロセス情報管理部403はサービスインベントリー706のコンポーネントB709のエントリーを検索し、その状態907に受け取った状態を「ビジー」状態に変更する。さらに最終連絡時刻908も更新する。コンポーネントB709の状態907が「ビジー」状態に変更になった為、プロセス情報管理部403は以降、名前を指定したクエリーを受け取ってもそのコンポーネントB709のプロセスを選定することはなくなる。ただし、サービスインベントリー706には他のコンポーネントBのプロセスが複数存在している可能性がある。それらのいずれかがビジー状態でなければ「利用可能なコンポーネントB」としてクエリーの発行元のコンポーネントに返却される。複数の同一名とバージョンを持ったコンポーネントプロセス群からどのプロセスをクエリーの結果として選択するのかに関しては、例えば最初に発見したプロセスを返却するようにする。もしくは、コンポーネントプロセスごとに、クエリー発行元のコンポーネントに返却された回数をカウントしておき、最もカウントの低いプロセスを返却するようにしてもよい。
図7(J)は終了条件806に達したコンポーネントB709が自ら終了する直前にGoodbyeメッセージ713を送信する様子を示したものである。Goodbyeメッセージを受け取ったプロセス情報管理部403はサービスインベントリー706のコンポーネントB709のエントリーを削除する。
各コンポーネントは終了条件806に達しているかを定期的に確認する。終了条件806は時間やジョブ数で指定し、終了条件806に指定された時間以上プロセスが起動しているか、終了条件806に指定されたジョブ数以上のジョブを処理した場合にプロセスを終了させる。ジョブ制御部402、フィルター制御部404は、定期的にリフレッシュさせるため、終了条件806として有限の時間、ジョブ数を指定する。ログ出力部408は常駐してログ出力依頼を受け付けるため、終了条件806として無限(もしくは非常に大きい値の)時間を指定する。ログ出力部408はジョブを処理しないため、終了条件806としてジョブ数は指定しない。
<クエリーの処理詳細>
図10は、クエリーの処理詳細を示したフローチャートである。
S1001は、プロセス情報管理部403が、他のコンポーネントからクエリー要求を受け付ける処理である。クエリーには、コンポーネントの名前と利用したいバージョンが含まれている。
S1002は、プロセス情報管理部403が、サービスカタログ701を探索し、S1001で受け付けたコンポーネント名とバージョンに対応するエントリー801が存在するかを判定する処理である。もし存在すればS1003に進む。存在しなければS1008に進む。
S1003は、プロセス情報管理部403が、ジョブ受け付け可能なコンポーネントプロセスが存在するかを判定する処理である。プロセス情報管理部403は、サービスインベントリー706を探索し、S1001で受け付けたコンポーネント名とバージョンに対応するエントリー901を探索する。そして、状態907が「アイドリング」のコンポーネントプロセスが1つ以上存在するかを判定する。もし存在する場合にはS1004に進む。S1004にて、ここで見つけたコンポーネントプロセスのうち1つを選択してクエリー要求元にエンドポイントを通知する。プロセスの選択方法としては、例えば、最初に見つけたコンポーネントプロセスを返すようにする。または例えば、コンポーネントプロセスごとに、何回クエリー要求元にエンドポイントを返したかをサービスインベントリー706に記憶しておき、最も回数の少ないコンポーネントプロセスを返すようにしてもよい。
S1004は、プロセス情報管理部403が、クエリー要求元に要求のあったコンポーネントプロセスのエンドポイントを通知する処理である。
S1005は、プロセス情報管理部403が、クエリー要求のあったコンポーネントの起動済みプロセス数がサービスカタログ701に記録されている最大起動数808未満かを判定する処理である。もし最大起動数808未満であればS1006に進む。そうでなければS1008に進む。
S1006は、プロセス情報管理部403が、クエリー要求のあったコンポーネントをプロセスとして起動する処理である。
S1007は、プロセス情報管理部403が、S1006で起動したコンポーネントプロセスからアドバタイズメッセージ705を受け付ける処理である。この処理の後にS1004に進み、S1006で起動したコンポーネントプロセスをクエリーの要求元に通知する。なお、図10には記載していないが、アドバタイズメッセージ705が規定時間内にプロセス情報管理部403に到着しない場合、エラーと判別し、S1008に進むようにしてもよい。
S1008は、プロセス情報管理部403が、クエリー要求元にエラーを通知する処理である。
<クラッシュ発生時>
図11は、フィルターAとフィルターBとでデータ変換処理を行う場合において、クラッシュが発生した際の処理の流れを示した図である。ここでは、フィルターA、フィルターBの間でパイプラインが接続されており、フィルターAの処理結果をフィルターBが受け取るものとして説明する。
S1101は、フィルターAが起動する処理である。
S1102は、フィルターAがパイプライン生成を行う処理である。フィルターAはジョブ制御部402から依頼を受け付け、パイプライン生成を行う。図6ではS604に相当する。
S1103は、フィルターAがデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。図6ではS605に相当する。図11では、フィルターAはデータ変換処理中にクラッシュしている。
S1104は、フィルターBが起動する処理である。
S1105は、フィルターBがパイプラインを生成する処理である。図6のS604で先述したとおり、ここでフィルターBはジョブ制御部402のサービスIFのエンドポイントを受け取る。
S1106は、フィルターBがデータ変換を行う処理である。フィルターBはパイプラインからデータが送信されてくるのを待機する。
S1107は、フィルターBがフィルターAのパイプラインの切断を検知する処理である。具体的には、フィルターA、フィルターB間で定期的に生存確認のためのパケットを送り合い、パケットが途絶えたことをタイムアウトにより検知する。
S1108は、フィルターBが、パイプライン切断を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。ログ出力部408は、このメッセージを受信し、ログファイルにパイプライン切断された旨を追記する。
S1109は、フィルターBが、ジョブ制御部402にエラー通知を行う処理である。エラー通知の際は、ジョブ制御部402のサービスIFのエンドポイントを通じてエラーを通知する。
S1110は、フィルターBが行う後処理である。具体的にはパイプラインの破棄や、プロセス情報管理部403に「アイドリング」状態への変更通知を行う。プロセス情報管理部403はその変更通知を受け取り、サービスインベントリー706において当該コンポーネントプロセスの状態907を「アイドリング」に変更する。
以上のように、フィルターAがクラッシュした場合であっても、他のコンポーネント(フィルターB、ジョブ制御部、ジョブ処理受け付け部)はクラッシュせずに、パイプラインが切断した旨をログファイルに残すことができる。
<ハングアップ発生時>
図12は、フィルターにてハングアップが発生した際の処理の流れを示した図である。図11と同様に、フィルターA、フィルターBの間でパイプラインが接続されており、フィルターAの処理結果をフィルターBが受け取るものとして説明する。
S1201は、フィルターAが起動する処理である。ここでは、プロセス情報管理部403から終了条件806が渡される。
S1202は、データ変換処理スレッドにおいて、フィルターAがパイプライン生成を行う処理である。
S1203は、ジョブのデータ変換を行う処理である。この処理の途中でフィルターAがハングアップに陥るものとする。
S1204は、S1201で受け取った終了条件806の時間を待機する処理である。図12ではフィルターAのデータ変換処理がハングアップしているケースを想定しているため、終了条件806に指定された時間が経過し、まだデータ変換処理スレッドが終了しないためS1205に進む。もし、データ変換処理スレッドが終了していた場合には、フィルターAは必要な後処理を行い、当該プロセスを終了する。
S1205は、フィルターAが、ハングアップに陥った旨を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。
S1206は、フィルターAが、プロセスを強制終了する処理である。
S1207は、フィルターBが起動する処理である。
S1208は、データ変換処理スレッドにおいて、フィルターAがパイプライン生成を行う処理である。
S1209は、フィルターBがデータ変換を行う処理である。フィルターBはパイプラインからデータが送信されてくるのを待機する。
S1210は、フィルターBがジョブ中止指示を受信する処理である。ジョブ制御部402は、タイマーを持ち、ジョブの処理が所定時間以上かかる場合には、各フィルター制御部404に対してジョブ中止指示を送信する。フィルターBはジョブ中止指示を受信し、ジョブ処理を終了する。
S1211は、フィルターBが、ジョブ中止指示によりジョブを中止した旨を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。
S1212は、フィルターBが、ジョブ制御部402に対してエラー通知を行う処理である。
S1213は、フィルターBが行う後処理である。
以上のように、フィルターAがハングアップに陥った場合であっても、他のコンポーネントはハングアップに陥らずに、ハングアップした旨や、フィルターBがジョブ中止した旨をログファイルに残すことができる。
(実施例2)
実施例1で説明したシステムは、各コンポーネントから依頼されたログを一つのファイルに出力するように構成されている。しかし、図13に示すように、1つのPC上に複数のユーザーシステムが存在するケースも考えられる。たとえば、印刷データ生成用のユーザーシステムと、スキャン画像処理用のユーザーシステムが存在するようなケースが考えられる。以下では、各ユーザーシステムにひもづくコンポーネント群を「グループ」と表現する。図13は、1つのPC上に、2つのユーザーシステムが存在する場合のコンポーネントの関係性を示した図である。
1301は、印刷データ生成用サービス1301である。また、1302は、スキャン画像処理用サービス1302である。図13に示す通り、一般的に、2つのグループにおいて、プロセス情報管理部403とログ出力部408とは共有されている。また、すべてのコンポーネントプロセスが共通のコントロールバス410に接続されている。
この場合、各グループに属するコンポーネントプロセスが一つのログ出力部408にログ出力すると、すべてのグループのコンポーネントのログが一つのログファイルに出力される。このような場合、ログの可読性の低下を招くことがある。また、ログ出力部408がクラッシュした場合に、双方のグループにおいてログが残せなくなってしまう。
<グループごとのコンポーネントの関連>
そこで、本実施例では、図14のようにグループごとにログ出力部408を用意する仕組みを提供する。具体的には、クエリーを行う際のコントロールバスへの接続アドレスおよびポートを、プロセスごとに排他的に割り当てる処理を行う。
図14では図示していないが、複数のプロセスをサービスごとにグループ分けするグループ設定手段が存在し、印刷データ生成用サービスとスキャン画像処理用サービスとのそれぞれに含まれるプロセスをグループ分けする。グループ分けされたプロセスは、他のグループからは排他的に制御される。
図14は、本実施例におけるグループごとのコンポーネントの関連を示した図である。
印刷データ生成用サービス用のログ出力部1401、プロセス情報管理部1403、コントロールバス1405を用意する。また、スキャン画像処理用サービス用のログ出力部1402、プロセス情報管理部1404、コントロールバス1406を用意する。
以下で、図14のコンポーネントプロセス群を構成するための処理について述べる。
<ジョブ処理受け付け部にコントロールバスへの接続アドレスおよびポートを割り当てる処理>
図15は、ジョブ処理受け付け部にコントロールバスへの接続情報(アドレスおよびポート)を割り当てる処理を示した図である。
本実施例では、起動する予定のジョブ処理受け付け部のプロセス数と同数のプロセス情報管理部のプロセスをあらかじめ起動しておく必要がある。本実施例ではジョブ処理受け付け部を2つ起動する想定のため、プロセス情報管理部のプロセスも2つ起動する。
本実施例では、グループAとグループBとに分け、それぞれに属するコンポーネントには、A、Bを付記して記載する。図15では、その2つのプロセス情報管理部のプロセスを、それぞれ「プロセス情報管理部A」「プロセス情報管理部B」と記載している。それぞれのプロセス情報管理部には、コントロールバスへの接続情報が書かれた設定ファイルを読み込ませる必要がある。
図16(A)および図16(B)は、プロセス情報管理部A、プロセス情報管理部Bがそれぞれ読み込む設定ファイルである。図16(A)、図16(B)において、接続情報1601、接続情報1602は、コントロールバスへの接続情報である。ここでは、プロセス情報管理部Aはアドレス“225.0.0.0”、ポート”54567”で、プロセス情報管理部Bはアドレス“225.0.0.0”、ポート”54569”でコントロールバスに接続することとなる。
実施例1では、プロセス情報管理部403はOSによって起動するようOSに設定しておく必要がある、ということを先述した。本実施例においては、プロセス情報管理部のプロセスごとに異なる設定ファイルを読み込むようOS上で設定しておく。
図15において、S1501は、プロセス情報管理部Aが起動し、図16(A)に示す設定ファイルを読み込む処理である。プロセス情報管理部Aは、読み込んだコントロールバスへの接続情報をRAM204に記憶する。プロセス情報管理部Bに関しても同様に、図16(B)に示す設定ファイルを読み込む。
S1502は、プロセス情報管理部Aがログ出力部のプロセスを起動する処理である。このプロセスをログ出力部Aとする。ここではログ出力部がホットスタンバイで起動する場合を想定している。同様に、プロセス情報管理部Bに関してもログ出力部のプロセスを起動する。このプロセスをログ出力部Bとする。
S1503は、ジョブ処理受け付け部のプロセスのうち1つが起動し、初期化を行う処理である。このプロセスを図15では、ジョブ処理受け付け部Aと記載している。
S1504は、ジョブ処理受け付け部Aが図16(C)に示す設定ファイルを読み込む処理である。図16(C)は、ジョブ処理受け付け部のプロセスが読み込む設定ファイルであり、利用可能なコントロールバスの接続情報が記載されている。本実施例では2つのジョブ処理受け付け部のプロセスが立ち上がる想定のため、2つの接続情報が、接続情報1603、接続情報1604として記載されている。
S1505は、ジョブ処理受け付け部Aが図16(C)の内容をもとに、未使用の接続情報を取得する処理である。ジョブ処理受け付け部Aは、接続情報1603、接続情報1604を上から順に他のジョブ処理受け付け部のプロセスから利用されていないかを確認する。具体的には、例えばOSの機能としてミューテックスが提供されている場合には、接続情報の上から順に、この接続情報から生成される文字列でミューテックスオブジェクトの作成を試みる。もし作成できた場合は、その接続情報は他のジョブ処理受け付け部のプロセスから利用されていないため、その接続情報をRAM204に記憶する。もし作成できない場合は、次の接続情報についてミューテックスオブジェクトの作成を試みる。もし、すべての接続情報についてミューテックスオブジェクトが作成できない場合は、そのジョブ処理受け付け部のプロセスを利用するユーザーシステムに対してエラーを返す。S1505では、ジョブ処理受け付け部Aは接続情報1603すなわち、“225.0.0.0”、ポート”54567”を記憶したものとする。
なお、ミューテックスオブジェクトを作成する際の文字列としては、ジョブ処理受け付け部のプロセス間に共通の規則に従っていれば良く、例えば「JobReceiver_(アドレス)_(ポート番号)」といった文字列を生成する。
S1506は、ジョブ処理受け付け部Aが接続情報1603を使ってコントロールバスに接続し、ログ出力部のクエリー要求を行う処理である。このクエリー要求は、同じ接続情報を使っているプロセス情報管理部Aにのみ届く。プロセス情報管理部Aは、S1507にてクエリーを受け付け、自身が管理しているログ出力部Aのエンドポイントをジョブ処理受け付け部Aに返却する。ジョブ処理受け付け部Aはログ出力部Aのエンドポイントを取得し、記憶する。
S1508は、ジョブ処理受け付け部Aがログ出力部Aに対してログ出力依頼を行う処理である。ここでは例えば初期化が完了した旨を示すメッセージを送信依頼する。S1509にて、ログ出力部Aがログ出力依頼を受け付け、そのメッセージをログファイルに追記する。
以上のように、ジョブ処理受け付け部Aに、コントロールバスの接続情報が割り当てられることで、同様の接続情報を利用しているプロセス情報管理部Aとログ出力部Aを利用できるようになる。別のジョブ処理受け付け部のプロセスが起動する場合には、S1505にてジョブ処理受け付け部Aとは別の接続情報1604が割り当てられ、プロセス情報管理部Bとログ出力部Bが利用できるようになる。
<ジョブ制御部の接続情報割り当ての流れ>
次に、ジョブ制御部Aにコントロールバスへの接続情報を割り当てる処理の流れを、図17を用いて説明する。図17は、図16から続く処理の流れとなっている。
ジョブ処理受け付け部Aはユーザーシステムからジョブを受け付けると、S1701にて、ジョブ制御部Aのクエリー要求を行う。S1702にて、プロセス情報管理部Aがクエリー要求を受け付け、ジョブ制御部Aのプロセスを起動する。
このとき、起動オプションとして、プロセス情報管理部Aが持つコントロールバスへの接続情報1601をジョブ制御部Aに渡す。
S1703は、ジョブ制御部Aが起動し、初期化を行う処理である。
S1704は、ジョブ制御部Aが接続情報1601を使ってコントロールバスに接続し、ログ出力部Aのクエリー要求を行う処理である。このクエリー要求は、同じ接続情報を使っているプロセス情報管理部Aにのみ届く。プロセス情報管理部Aは、S1705にてクエリーを受け付け、自身が管理しているログ出力部Aのエンドポイントをジョブ制御部Aに返却する。ジョブ制御部Aはログ出力部Aのエンドポイントを取得し、記憶する。
S1706は、ジョブ制御部Aがログ出力部Aに対してログ出力依頼を行う処理である。ここでは例えばジョブ受け付け可能となった旨を示すメッセージを送信依頼する。S1707にて、ログ出力部Aがログ出力依頼を受け付け、そのメッセージをログファイルに追記する。
ここでは、ジョブ制御部Aにコントロールバスへの接続情報を割り当てる方法を説明したが、ジョブ制御部Aがフィルター制御部Aのプロセスをクエリーする際も同様の方法で接続情報が割り当てられる。
以上のように、ジョブ処理受け付け部Aが利用するジョブ制御部Aや、さらにそのジョブ制御部Aが利用するフィルター制御部Aに、共通のコントロールバスへの接続情報が割り当てられる。
結果的に、そのグループで共通のログ出力部Aプロセスを利用することが可能となる。
(実施例3)
本実施例も実施例2と同様に、グループごとにログ出力部を割りあてる方法を提供する。
本実施例では、起動する予定のジョブ処理受け付け部のプロセス数と同数のプロセス情報管理部のプロセスをあらかじめ起動しておくようOSに設定しておく必要があった。そのため、ユーザーシステムの数が想定よりも多くなった場合には、再度設定を行わなければならない。また、図16に示した設定ファイルの内容も修正しなければならない。
本実施例では、図18に示すように、一つのプロセス情報管理部1403のみを起動し、プロセス情報管理部1403でグループを管理させる方法を提供する。図18は、プロセス情報管理部1403でグループを管理する場合のコンポーネント構成を示した図である。なお、コントロールバス1405もグループで共通のものを用いる。
<グループ生成の流れ>
図19は、グループ生成の流れを示した図である。
ここでは、あらかじめプロセス情報管理部1403のプロセスが起動しており、印刷データ生成用サービス1301がジョブ処理受け付け部401をロードした状態から説明する。本実施例においても、実施例2と同様に、図19では、ジョブ処理受け付け部が動作するプロセスをジョブ処理受け付け部Aと記載している。
S1901は、ジョブ処理受け付け部Aが初期化を行う処理である。
S1902は、ジョブ処理受け付け部Aが、プロセス情報管理部1403にグループ生成依頼を行う処理である。S1903にて、プロセス情報管理部1403はその依頼を受け付け、グループIDを生成し、RAM204に記憶し、そのグループIDをジョブ処理受け付け部Aに通知する。ここで、プロセス情報管理部1403は、グループの設定を行うグループ設定手段として機能する。実施例2と同様に、グループ分けされたプロセスは、他のグループからは排他的に制御される。
グループIDは例えばGUIDなどユニークな文字列を用いるが、ここでは便宜的に001というグループIDが生成されたものとして説明を続ける。また、以下ではグループIDの001という値を「グループID:001」と記載する。ジョブ処理受け付け部AはそのグループIDをRAM204上に例えばリスト形式で記憶する。
S1904は、ジョブ処理受け付け部Aが、ログ出力部Aのクエリーを要求する処理である。このとき、ジョブ処理受け付け部Aは、グループIDとして001を指定してクエリー要求を行う。S1905にて、プロセス情報管理部1403はそのクエリー要求を受け付ける。プロセス情報管理部1403は、ジョブ処理受け付け部Aから指定されたグループIDに所属する起動済みコンポーネントプロセスがあるか否かを確認する。本実施例では、図9に示すサービスインベントリー706において、各コンポーネントプロセスのグループIDも記録する。プロセス情報管理部1403は、サービスインベントリー706を探索し、指定されたグループIDに所属する「アイドリング」状態のプロセスが存在すれば、そのエンドポイントをジョブ処理受け付け部Aに返却する。もし、存在しなければ、クエリー要求のあったコンポーネントをプロセスとして起動する。この実施例では、指定されたグループIDに所属する「アイドリング」状態のログ出力部Aのプロセスが存在しなかったケースを想定しており、プロセス情報管理部1403はログ出力部Aをプロセスとして起動する。このプロセスをログ出力部Aとする。プロセス情報管理部1403は、ログ出力部Aを起動する際、起動オプションとしてグループID:001を渡す。プロセス情報管理部1403は、起動したログ出力部Aからのアドバタイズメッセージ705を受け取ると、サービスインベントリー706の対応するエントリーを作成し、ログ出力部AがグループID:001に所属している旨を記録する。
なお、本実施例でも実施例1と同様にコンポーネントごとの最大起動数808を設定できるようにしてもよい。その場合、グループごとに最大起動数を設定できるようにしてもよい。
S1906は、ジョブ処理受け付け部Aが、ジョブ制御部Aのクエリーを要求する処理である。このとき、ジョブ処理受け付け部Aは、グループIDとして001を指定してクエリー要求を行う。S1907にて、プロセス情報管理部1403はそのクエリー要求を受け付ける。受け付けた後の処理は、S1905と同様のため省略する。この実施例では、プロセス情報管理部1403は、起動オプションとして、グループID:001を指定して、ジョブ制御部402のプロセスを起動する。起動したプロセスをジョブ制御部Aとする。
S1908は、ジョブ制御部Aが、自身を初期化する処理である。
S1909は、ジョブ制御部Aが、グループID:001を指定してログ出力部Aのクエリーを要求する処理である。S1910で、プロセス情報管理部1403はそのクエリー要求を受け付ける。ここでは、グループID:001に所属するログ出力部408すなわちログ出力部Aが存在するため、プロセス情報管理部1403そのエンドポイントをジョブ制御部Aに返却する。
S1911は、ジョブ制御部Aがログ出力部Aに対してログ出力依頼を行う処理である。S1912は、ログ出力部Aがログ出力依頼を受け付け、そのメッセージをログファイルに追記する。
<グループ削除の流れ>
図18において、印刷データ生成用サービス1301は通常、システムに常駐しサービスを提供するが、例えば、動作しているサーバーのメンテナンスのためシャットダウンが必要なケースが存在する。以下では、印刷データ生成用サービス1301のプロセスがシャットダウンし、グループを削除する処理の流れを説明する。
図20はグループ削除処理の流れを説明した図である。ここでは、ジョブ処理受け付け部A、プロセス情報管理部A、ジョブ制御部A、フィルター制御部A、ログ出力部Aのそれぞれのプロセスが起動しており、すべて同じグループID:001に所属しているものとする。また、ジョブ処理はすべて完了した状態とする。
S2001は、ジョブ処理受け付け部Aが、グループID:001を指定して、グループ削除依頼をする処理である。
S2002で、プロセス情報管理部1403は、グループ削除依頼を受け付け、設定されたグループを削除する削除手段として機能し、グループのリストからグループID:001を削除する。
S2003は、ジョブ処理受け付け部Aが行う終了処理である。
S2004は、ジョブ制御部Aおよびフィルター制御部Aが終了条件チェックを行う処理である。ジョブ制御部402およびフィルター制御部Aが起動したときにプロセス情報管理部1403から渡された終了条件806をもとに、終了すべきかどうかをチェックする。ジョブ制御部Aおよびフィルター制御部Aは終了条件を満たしていた場合はプロセスを終了する。終了条件を満たしていない場合は一定時間後に再度終了条件を確認する。
S2005は、ログ出力部Aが終了条件チェックを行う処理である。本実施例においては、ログ出力部Aは、他のコンポーネントプロセスからのログ出力依頼が所定時間なかった場合にプロセスを終了する。
図19ではジョブ制御部AがグループID:001に所属するログ出力部Aを取得する方法を説明した。また、図20を用いてグループを削除する処理についても説明した。
ジョブ制御部Aがフィルター制御部Aのプロセスをクエリーする際も図19と同様の処理が行われる。つまり、プロセス情報管理部1403は、フィルター制御部AをグループID:001に所属させる。また、そのフィルター制御部AもグループID:001に所属するログ出力部Aをクエリーし、利用することができるようになる。以上のように、グループで共通のログ出力部Aプロセスを利用することが可能となる。
(実施例4)
上記実施例においては、複数のデータ変換フィルターによる処理それぞれを異なるプロセスで実行することにより、一部のデータ変換フィルターの不具合がシステム全体に波及する可能性を低くした。
上記実施例の通り、複数のデータ変換それぞれを異なるプロセスで実行すれば、一部のデータ変換フィルターの不具合がシステム全体に波及する可能性を低くすることが出来る。しかし、複数のデータ変換を単一のプロセスで実行するよりも実行速度が低下することがある。これは、プロセス間通信の頻度が高まり、プロセス間通信の処理による遅延が発生するためである。本実施例では、複数のデータ変換フィルターそれぞれの信頼度に基づき、異なるプロセスで実行するデータ変換フィルターを選択する。本実施例の技術では、データ変換フィルターそれぞれの信頼度に基づいて、異なるプロセスで実行するデータ変換フィルターを選択することにより、データ変換の処理速度の維持と一部のデータ変換フィルターの不具合の波及の防止とを両立させることが出来る。
以下、本実施例の詳細について説明する。
図21は、本実施例における印刷データ変換サービス301が依頼された印刷データを変換する際に利用するソフトウェアコンポーネント群の関連を説明する図である。
以下に、図21を用いて、印刷データ変換サービス301が利用するソフトウェアコンポーネントそれぞれの概要について説明する。尚、図21におけるソフトウェアコンポーネント群の関連は、実施例1における図4とほぼ同様である。ここでは、実施例1における図4と異なる点について説明する。
実施例1における図4と異なる点は、稼働実績蓄積部411が追加されていることである。以下、本実施例における稼働実績蓄積部411の詳細について説明する。
<稼働実績蓄積部>
稼働実績蓄積部411はプロセスとしてコントロールバス410上に存在する。
稼働実績蓄積部411は、RAM204上に、図22に示すような稼働実績を格納したテーブルを保持する。図22では、各データ変換フィルターは信頼度が低いとしている。
このテーブルは、稼働実績蓄積部411を起動時に外部設定ファイルから読み込まれ、終了時に外部設定ファイルへ書き出される。
テーブルはフィルター名1301、バージョン1302、処理ジョブ数1303、異常終了回数1304、信頼度1305、判定閾値1306の項目を有する。フィルター名1301にはデータ変換モジュールにて使用されるフィルターの名前、バージョン1302には各フィルターのバージョンが保持されている。また、処理ジョブ数1303には各フィルターが処理したジョブの回数、異常終了回数1304には各フィルターが異常終了した回数、信頼度1305には各フィルターの信頼度、判定閾値1306には信頼度の判定に用いる閾値が保持されている。
本実施例では、データ変換モジュールのサービス開始時の初期設定では、図22に示すように、処理ジョブ数1303および異常終了回数1304は全て「0」、信頼度1305は全て「低」に設定されている。
稼働実績蓄積部411は、ジョブ制御部402から問い合わせを受けた各フィルターの信頼度を、ジョブ制御部402へ回答する機能を有する。
稼働実績蓄積部411は、ジョブ制御部402から、「ジョブ終了通知」および「異常終了フィルター通知」を受けると、稼働実績を格納したテーブルを更新する。具体的には、「ジョブ終了通知」を参照して、ジョブで変換に用いた各フィルターの処理ジョブ数1303をそれぞれ1カウントアップする。また、「異常終了フィルター通知」を参照して、異常終了したフィルターの異常終了回数1304を1カウントアップする。
稼働実績蓄積部411は、このテーブルを参照して、信頼度を判定し、信頼度1305を上書きする。信頼度の判定方法については次に説明する。
<信頼度の判定方法>
稼働実績蓄積部411は、フィルターの信頼度を、予め定められた信頼度判定式を用いて信頼度判定値を算出する。信頼度判定式の例を以下に示す。
信頼度判定値=処理ジョブ数/(異常終了回数+1) (1)
稼働実績を格納したテーブルの値から式(1)を用いて算出した信頼度判定値が、判定閾値1306以上であれば信頼度「高」と判定し、判定閾値1306より小さければ信頼度「低」と判定する。
図23に、稼働実績が蓄積した後のテーブルの一例を示す。フィルターAは、処理ジョブ数1303は50000、異常終了回数1304は2であるため、信頼度判定値は50000/3となり、判定閾値10000以上であるため、信頼度は「高」と判定される。また、フィルターZは、処理ジョブ数1303は10、異常終了回数1304は0であるため、信頼度判定値は10/1となり、判定閾値10000より小さいため、信頼度は「低」と判定される。
ここで、式(1)の分母を(異常終了回数 +1)としているのは、フィルターZのように、処理ジョブ数1303が少なく、異常終了回数が0のフィルターが、信頼度「高」と判定されるのを防ぐためである。
<ジョブ制御部402>
ジョブ制御部402は、実施例1におけるジョブ制御部402と同様の機能を有する。
ただし、本実施例におけるジョブ制御部402は、ジョブに含まれているジョブ種別情報と一致する要素501を探索し、一致する要素501の下に書かれている各フィルターの信頼度を、前述の稼働実績蓄積部411へ問い合わせる。稼働実績蓄積部411から回答があった各フィルターの信頼度をもとに、フィルター制御部404の個数および、各フィルターがロードされるフィルター制御部名を決定する。決定方法については図24および図25を用いて後述する。決定したフィルター制御部404の個数は設定ファイルの要素501のFilter Host num属性へ、各フィルターがロードされるフィルター制御部名を要素502のFilter Host name属性へ上書きする。
なお、変換に用いるフィルター制御部404の個数および、フィルターの種類と並び順と各フィルターがロードされるフィルター制御部名は、ジョブ種別情報の代わりに、印刷データを解析して決定するようにしてもよい。
ジョブ制御部402は、RAM204上に、「フィルター変換完了数」を記録する機能を有する。この「フィルター変換完了数」はジョブの処理中に、クラッシュやハングアップなどの異常終了が発生した場合に、異常終了したフィルターを判定するために用いる。この「フィルター変換完了数」を記録する処理について説明する。ジョブ制御部402は、初段のフィルター制御部404に接続されているパイプラインにデータを流した後、「フィルター変換完了数」を0に初期化する。その後、フィルター制御部404から「フィルター変換完了通知」を受け取るたびに、「フィルター変換完了数」を1カウントアップする。「フィルター変換完了通知」については後述する。
ジョブ制御部402は、ジョブの処理が正常に完了した際には、稼働実績蓄積部411へ「ジョブ終了通知」を送信する。「ジョブ終了通知」には、そのジョブで変換に用いた各フィルターのフィルター名およびバージョンが記述されている。
ジョブ制御部402は、ジョブの処理中に異常終了が発生した場合は、異常終了したフィルターを判定し、稼働実績蓄積部411へ「ジョブ終了通知」および「異常終了フィルター通知」を送信する。「異常終了フィルター通知」には、異常終了したフィルターのフィルター名およびバージョンが記述されている。異常終了が発生した際の処理は、図26、図27を用いて後述する。
<フィルター制御部の個数、各フィルターがロードされるフィルター制御部名の決定方法>
設定ファイルと稼働実績蓄積部411から回答があった各フィルターの信頼度をもとに、フィルター制御部404の個数および、ロードされるフィルター制御部名を決定し、設定ファイルを上書きする方法について詳述する。
図24で示すように、フィルターAからフィルターFまで6種類のフィルターが順番に処理され、各フィルターの信頼度がそれぞれ1401の場合について説明する。隣り合うフィルターの信頼度が「高」「高」の場合には同一プロセス、「低」「低」、「低」「高」、「高」「低」の場合には別プロセスとなるように、フィルター制御部の個数1403、各フィルターがロードされるフィルター制御部名1402を決定する。フィルター制御部名1402が同一に決定されたフィルター(この例では、フィルターAとフィルターB、フィルターEとフィルターF)は同一プロセスとして処理される。
図25のフローチャートを用いて処理を説明する。
まず、S1401において、ジョブ制御部402が、設定ファイルと稼働実績蓄積部411から回答があった各フィルターの信頼度をもとに、フィルター種類とその信頼度を処理順に並べる。
S1402において、ジョブ制御部402が、1番目のフィルター(この例ではフィルターA)をロードするフィルター制御部名をフィルター制御部1と決定し、設定ファイルの要素502のFilter Host name属性へ上書きする。
S1403において、ジョブ制御部402が、パラメータの初期値をm=2、n=1と設定する。ここで、各パラメータは下記を意味する。
m:フィルターを処理順に並べた場合のフィルターの順番を示すパラメータ
n:フィルター制御部名およびフィルター制御部の個数を決定する際に使用するパラメータ
次に、S1404において、ジョブ制御部402が、隣り合うフィルターのプロセスを結合するか否かを判定する。具体的には、隣り合うm−1番目のフィルターとm番目のフィルターの信頼度が、「高」「高」であれば、フィルターのプロセスを結合すると判定しS1406へ進む。また、「高」「低」、「低」「高」、または「低」「低」であればプロセスは結合しないと判定しS1405へ進む。図24に記載の例では、m−1番目のフィルターAが「高」、m番目のフィルターBが「高」であるため、プロセスを結合すると判定し、S1406へ進む。
S1406において、ジョブ制御部402が、m番目のフィルター(ここではフィルターB)をロードするフィルター制御部名をフィルター制御部n(ここでは、フィルター制御部1)と決定する。また、決定したフィルター制御部名を設定ファイルの要素502のFilter Host name属性へ上書きする。
S1407において、ジョブ制御部402が、m<Mであるか否かを判定し、m<Mである場合はS1408へ進み、m<Mでない場合はS1409へ進む。ここで、Mはこのジョブで用いるフィルターの数(ここでは6個)を意味する。 この例では、m=2<6であるため、S1408へ進む。
S1408において、ジョブ制御部402が、パラメータmの値を1カウントアップする(ここでは,m=3となる)。次に、S1404において、ジョブ制御部402が、隣り合うフィルターのプロセスを結合するか否かを判定する。図24に記載の例では、m−1番目のフィルターBが「高」、m番目のフィルターCが「低」であるため、プロセスは結合しないと判定しS1405へ進む。
S1405において、ジョブ制御部402が、パラメータnの値を1カウントアップする(ここではn=2となる)。
S1406において、ジョブ制御部402が、m番目のフィルター(ここではフィルターC)をロードするフィルター制御部名をフィルター制御部n(ここでは、フィルター制御部2)と決定する。また、決定したフィルター制御部名を設定ファイルの要素502のFilter Host name属性へ上書きする。
S1404からS1408の処理をm<Mではなくなるまで繰り返す。
S1409において、ジョブ制御部402が、ジョブ制御部の個数をn個(図24の例では4個)と決定し、設定ファイルの要素501のFilter Host num属性へ上書きする。
また、フィルター制御部404は、自身がロードしたフィルターが、ジョブの処理を完了した際に、ジョブ制御部402へ「フィルター変換完了通知」を送る。1つのフィルター制御部404が複数のフィルターをロードしている場合には、複数のフィルターそれぞれが順次ジョブの処理を完了するたびに、ジョブ制御部402へ「フィルター変換完了通知」を送る。
ジョブのデータの末尾には、データ末尾を示す終端判別データが含まれており、フィルター制御部404は、その終端判別データを識別することにより、各フィルターがジョブの処理を完了したと判断することができる。
<正常終了する場合のデータ処理>
図28は、ジョブ処理受け付け部401が印刷データ変換サービス301からジョブ処理を受け付けた後の、データ変換処理の概要を示したシーケンス図である。
S601は、ジョブ処理受け付け部401がジョブ制御部402のクエリー要求を行う処理である。ジョブ処理受け付け部401は、プロセス情報管理部403にクエリー要求を行い、ジョブ制御部402のエンドポイントを取得する。
S602は、ジョブ処理受け付け部401がジョブ制御部402に対してジョブ処理依頼を行う処理である。ここで、ジョブのデータが、ジョブ処理受け付け部401からジョブ制御部402に渡される。受け渡しには、ジョブのデータのパスで渡すようにしても良いし、メモリやプロセス間通信で渡すようにしてもよい。
S603は、ジョブ制御部402が、動作実績蓄積部411のクエリー要求を行う処理である。ジョブ制御部402は、プロセス情報管理部403にクエリー要求を行い、動作実績蓄積部411のエンドポイントを取得する。
S604は、ジョブ制御部402が、ジョブのデータに含まれているジョブ種別情報を基に、このジョブで用いる各フィルターの信頼度を稼働実績蓄積部411へ問い合わせる。ここでは、ジョブ種別は「プリントサービスA用変換」として説明する。ジョブ制御部402は、「プリントサービスA用変換」と一致する、設定ファイル(図5)の要素501を探索する。そして、探索して一致した要素501の下に書かれている各フィルター(ここではフィルターA、フィルターB、フィルターC)の信頼度を、稼働実績蓄積部411へ問い合わせる。その際、各フィルターのフィルター名、バージョン、およびジョブ制御部402のサービスIFのエンドポイントも稼働実績蓄積部411へ通知する。
S605は、稼働実績蓄積部411が、問い合わせを受けた各フィルターの信頼度を、ジョブ制御部402のサービスIFを通じて、ジョブ制御部402へ回答する。データ変換モジュールのサービス開始時の初期設定では、稼働実績を格納したテーブルの信頼度1305は全て「低」に設定されているため、フィルターA、フィルターB、フィルターCの信頼度は全て「低」と回答する。
S606は、ジョブ制御部402が、各フィルターの信頼度をもとに、フィルター制御部404の個数および、各フィルターがロードされるフィルター制御部名を決定する。また、決定したフィルター制御部404の個数は設定ファイル(図5)の要素501のFilter Host num属性へ、各フィルターがロードされるフィルター制御部名を要素502のFilter Host name属性へ上書きする。ここでは、フィルター制御部404は3個、フィルターA405はフィルター制御部1、フィルターB406はフィルター制御部2、フィルターC407はフィルター制御部3にロードされるように上書きする。
S607は、ジョブ制御部402が、プロセス情報管理部403に対して、設定ファイル(図5)にもとづき各フィルターに対応するフィルター制御部404のクエリー要求を行い、それぞれのエンドポイントを取得する。ここでは、フィルターA405をロードしたフィルター制御部1、フィルターB406をロードしたフィルター制御部2、フィルターC407をロードしたフィルター制御部3のエンドポイントを取得する。
S608は、パイプラインを生成する処理である。ジョブ制御部402は、各フィルター制御部404に対してパイプラインの生成を指示する。各フィルター制御部404は、それぞれ隣り合うコンポーネントプロセスとのパイプラインを生成する。パイプライン生成を完了した後、各フィルター制御部404はジョブ制御部402にパイプライン生成完了を通知し、各フィルター制御部404への入力パイプラインからジョブが流れてくるのを待機する。なお、ジョブ制御部402は、各フィルター制御部404に対してパイプラインの生成を指示する際に、ジョブ制御部402のサービスIFのエンドポイントも各フィルター制御部404に通知する。フィルター制御部404はエラーが起こった際に、このジョブ制御部402のサービスIFを通じて、ジョブ制御部402にエラーを通知する。また、フィルター制御部404は、自身がロードしたフィルターが、ジョブの処理を完了した際に、このジョブ制御部402のサービスIFを通じて、ジョブ制御部402に「フィルター変換完了通知」を通知する。
S609は、データ変換処理である。ジョブ制御部402は、初段のフィルター制御部1に接続されているパイプラインにデータを流した後、「フィルター変換完了数」を0に初期化する。フィルター制御部1はデータを受け取り、フィルターAを用いてデータ変換処理を行う。そして、フィルター制御部1は、フィルター制御部2と接続されているパイプラインにデータを流した後、ジョブ制御部402へ「フィルター変換完了通知」を送信する。ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。フィルター制御部2、フィルター制御部3でも同様にデータ変換処理が行われる。最終的に、フィルター制御部3から、ジョブ制御部402に変換後のデータが送信される。
S610は、ジョブ制御部402が、ジョブ処理受け付け部401に対して変換後のデータを返却する処理である。
S611は、ジョブ制御部402が、稼働実績蓄積部411へ「ジョブ終了通知」を通知する。「ジョブ終了通知」には、そのジョブで変換に用いた各フィルターのフィルター名およびバージョンが記述されている。
S612は、稼働実績蓄積部411が、ジョブ制御部402から「ジョブ終了通知」を受けて、図22に示すような稼働実績を格納したテーブルを更新する。具体的には、「ジョブ終了通知」を参照して、ジョブで変換に用いた各フィルターの処理ジョブ数1303を、それぞれ1カウントアップする。ここでは、フィルターA、フィルターB、フィルターCの処理ジョブ数1303をそれぞれ1カウントアップする。
S613は、稼働実績蓄積部411が、稼働実績を格納したテーブルが更新されるたびに、更新されたフィルターの信頼度の判定を行い、信頼度1305を上書きする。
<クラッシュした場合の処理>
図26は、データ変換処理中にクラッシュが発生した際の処理の流れを示した図である。図28で説明した処理フローのS607以降の処理で、クラッシュが発生した場合の処理フローである。ここでは、フィルターAをロードしたフィルター制御部1がデータ変換を行う際にクラッシュしたものとして説明する。
S1101は、フィルターAをロードしたフィルター制御部1が起動する処理である。図28ではS607に相当する。
S1102は、フィルター制御部1がパイプライン生成を行う処理である。フィルター制御部1はジョブ制御部402から依頼を受け付け、パイプライン生成を行う。図28ではS608に相当する。
S1103は、フィルター制御部1がフィルターAを用いてデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。図26では、フィルターAをロードしたフィルター制御部1がデータ変換処理中にクラッシュしている。
S1104は、フィルターBをロードしたフィルター制御部2が起動する処理である。
S1105は、フィルター制御部2がパイプラインを生成する処理である。図28のS608で先述したとおり、ここでフィルター制御部2はジョブ制御部402のサービスIFのエンドポイントを受け取る。
S1106は、フィルター制御部2がフィルターBを用いてデータ変換を行う処理である。フィルター制御部2はパイプラインからデータが送信されてくるのを待機する。
S1107は、フィルター制御部2がフィルター制御部1のパイプラインの切断を検知する処理である。具体的には、フィルター制御部1、フィルター制御部2間で定期的に生存確認のためのパケットを送り合い、パケットが途絶えたことをタイムアウトにより検知する。
S1108は、フィルター制御部2が、パイプライン切断を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。ログ出力部408は、このメッセージを受信し、ログファイルにパイプライン切断された旨を追記する。
S1109は、フィルター制御部2が、ジョブ制御部402にエラー通知を行う処理である。エラー通知の際は、ジョブ制御部402のサービスIFのエンドポイントを通じてエラーを通知する。
S1110は、フィルター制御部2が行う後処理である。具体的にはパイプラインの破棄や、プロセス情報管理部403に「アイドリング」状態への変更通知を行う。プロセス情報管理部403はその変更通知を受け取り、サービスインベントリー706において当該コンポーネントプロセスの状態907を「アイドリング」に変更する。
S1111は、ジョブ制御部402が、フィルター制御部1へ入力データを送信する。図28ではS609の「入力データ送信」に相当する。
S1112は、ジョブ制御部402が、フィルター変換完了数を0に初期化する。図28ではS609の「フィルター変換完了数初期化 」に相当する。
S1113は、ジョブ制御部402が、フィルター制御部2からエラー通知を受け、設定ファイル(図5)およびフィルター変換完了数を参照し、クラッシュしたフィルターを判定する。ここでは、フィルター変換完了数は0となっており、設定ファイル項目502の1番最初のフィルターAがクラッシュしたと判定する。
S1114は、ジョブ制御部402が、稼働実績蓄積部411へ「ジョブ終了通知」および「異常終了フィルター通知」を通知する。「ジョブ終了通知」には、そのジョブで変換に用いた各フィルターのフィルター名およびバージョンが記述されている。「異常終了フィルター通知」には、クラッシュしたフィルターのフィルター名およびバージョンが記述されている。
S1115は、稼働実績蓄積部411が、ジョブ制御部402から「ジョブ終了通知」および「異常終了フィルター通知」を受けて、図22に示すような稼働実績を格納したテーブルを更新する。具体的には、「ジョブ終了通知」を参照して、ジョブで変換に用いた各フィルターの処理ジョブ数1303を、それぞれ1カウントアップする。こここでは、フィルターA、フィルターB、フィルターCの処理ジョブ数1303をそれぞれ1カウントアップする。また、「異常終了フィルター通知」を参照して、クラッシュしたフィルターの異常終了回数1304を1カウントアップする。ここでは、フィルターAの異常終了回数1304を1カウントアップする。
S1116は、稼働実績蓄積部411が、更新された各フィルターの信頼度の判定を行い、信頼度1305を上書きする。
以上のように、フィルター制御部1がクラッシュした場合であっても、他のコンポーネント(フィルター制御部2、ジョブ制御部402、ジョブ処理受け付け部)はクラッシュせずに、パイプラインが切断した旨をログファイルに残すことができる。また、稼働実績を蓄積することができる。
この例では、フィルター制御部1がクラッシュし、その次のコンポーネントプロセスであるフィルター制御部2がパイプラインの切断を検知し、エラー通知を行う例を示した。同様に、フィルター制御部2がクラッシュした場合はフィルター制御部3、フィルター制御部3がクラッシュした場合はジョブ制御部402がパイプラインの切断を検知し、エラー通知を行えばよい。つまり、クラッシュしたフィルター制御部の次のコンポーネントプロセスがパイプラインの切断を検知し、エラー通知を行えばよい。
<ハングアップした場合の処理>
図27は、データ変換処理中にハングアップが発生した際の処理の流れを示した図である。図28で説明した処理フローのS607以降の処理で、ハングアップが発生した場合の処理フローである。ここでは、フィルターAをロードしたフィルター制御部1がデータ変換を行う際に、ハングアップしたものとして説明する。
S1201は、フィルターAをロードしたフィルター制御部1が起動する処理である。ここでは、プロセス情報管理部403から終了条件806が渡される。
S1202は、データ変換処理スレッドにおいて、フィルター制御部1がパイプライン生成を行う処理である。
S1203は、フィルター制御部1がフィルターAを用いて、ジョブのデータ変換を行う処理である。この処理の途中でフィルターAがハングアップに陥るものとする。
S1204は、フィルターBをロードしたフィルター制御部2が起動する処理である。
S1205は、データ変換処理スレッドにおいて、フィルター制御部2がパイプライン生成を行う処理である。
S1206は、フィルター制御部2がフィルターBを用いてデータ変換を行う処理である。フィルター制御部2はパイプラインからデータが送信されてくるのを待機する。
S1207は、フィルター制御部2がジョブ制御部402から送信されたジョブ中止指示を受信し、ジョブ処理を終了する。
S1208は、フィルター制御部2が、ジョブ中止指示によりジョブを中止した旨を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。
S1209は、フィルター制御部2が、ジョブ制御部402に対してエラー通知を行う処理である。
S1210は、フィルター制御部2が行う後処理である。
S1211は、ジョブ制御部402が、フィルター制御部1へ入力データを送信する。図28ではS609の「入力データ送信」に相当する。
S1212は、ジョブ制御部402が、フィルター変換完了数を0に初期化する。図28ではS609の「フィルター変換完了数初期化」に相当する。
S1213は、ジョブ制御部402がジョブ中止指示を送信する。ジョブ制御部402は、タイマーを持ち、ジョブの処理が所定時間以上かかる場合には、各フィルター制御部404に対してジョブ中止指示を送信する。
S1214は、ジョブ制御部402が、設定ファイル(図5)およびフィルター変換完了数を参照し、ハングアップしたフィルターを判定する。ここでは、フィルター変換完了数は0となっており、設定ファイル項目502の1番最初のフィルターAがハングアップと判定する。
S1215は、ジョブ制御部402が、稼働実績蓄積部411へ「ジョブ終了通知」および「異常終了フィルター通知」を通知する。「ジョブ終了通知」には、そのジョブで変換に用いた各フィルターのフィルター名およびバージョンが記述されている。「異常終了フィルター通知」には、ハングアップしたフィルターのフィルター名およびバージョンが記述されている。
S1216は、稼働実績蓄積部411が、ジョブ制御部402から「ジョブ終了通知」および「異常終了フィルター通知」を受けて、図22に示す稼働実績を格納したテーブルを更新する。具体的には、「ジョブ終了通知」を参照して、ジョブで変換に用いた各フィルターの処理ジョブ数1303を、それぞれ1カウントアップする。こここでは、フィルターA、フィルターB、フィルターCの処理ジョブ数1303をそれぞれ1カウントアップする。また、「異常終了フィルター通知」を参照して、ハングアップしたフィルターの異常終了回数1304を1カウントアップする。ここでは、フィルターAの異常終了回数1304を1カウントアップする。
S1217は、稼働実績蓄積部411が、更新された各フィルターの信頼度の判定を行い、信頼度1305を上書きする。
以上のように、ジョブ制御部1がハングアップに陥った場合であっても、他のコンポーネントはハングアップに陥らずに、ハングアップした旨や、ジョブ制御部2がジョブ中止した旨をログファイルに残すことができ、また、稼働実績を蓄積することができる。
<稼働実績蓄積後の処理>
稼働実績が蓄積した後のテーブルが、図23で示す値となっている場合に、ジョブ種別「プリントサービスA用変換」のジョブを処理する例について、図29を用いて説明する。
図28と同一処理については同一符号とし、説明を省略する。
S1501は、稼働実績蓄積部411が、問い合わせを受けた各フィルターの信頼度を、ジョブ制御部402のサービスIFを通じて、ジョブ制御部402へ回答する。フィルターAの信頼度は「高」、フィルターBの信頼度は「高」、フィルターCの信頼度は「低」と回答する。
S1502は、ジョブ制御部402が、各フィルターの信頼度をもとに、フィルター制御部404の個数および、各フィルターがロードされるフィルター制御部名を決定する。また、決定したフィルター制御部404の個数は設定ファイル(図5)の要素501のFilter Host num属性へ、各フィルターがロードされるフィルター制御部名を要素502のFilter Host name属性へ上書きする。
ここでは、フィルター制御部404は2個、フィルターA405はフィルター制御部1、フィルターB406はフィルター制御部1、フィルターC407はフィルター制御部2にロードされるように上書きする。
S1503は、ジョブ制御部402が、プロセス情報管理部403に対して、設定ファイル(図5)にもとづき各フィルターに対応するフィルター制御部404のクエリー要求を行い、それぞれのエンドポイントを取得する。ここでは、フィルターA405およびフィルターB406をロードしたフィルター制御部1、フィルターC407をロードしたフィルター制御部2のエンドポイントを取得する。
S1504は、データ変換処理である。ジョブ制御部402は、初段のフィルター制御部1に接続されているパイプラインにデータを流した後、「フィルター変換完了数」を0に初期化する。フィルター制御部1は、フィルターAを用いてデータ変換処理を行う。フィルター制御部1は、フィルターAを用いたデータ変換処理が完了したらジョブ制御部402へ「フィルター変換完了通知」を送信する。ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。フィルター制御部1は、フィルターBを用いてデータ変換処理を行う。そして、フィルター制御部1は、フィルター制御部2と接続されているパイプラインにデータを流した後、ジョブ制御部402へ「フィルター変換完了通知」を送信する。
ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。
続いて、フィルター制御部2は、フィルターCを用いてデータ変換処理を行う。フィルターCを用いたデータ変換処理が完了したらジョブ制御部402へ「変換後データ」「フィルター変換完了通知」を送信する。
ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。
以上説明したように、信頼度が「高」であるフィルターAとフィルターBは、同一のプロセスで処理され、プロセス間通信が発生しないため、パフォーマンスの劣化を抑制することができる。また、信頼度が「低」あるフィルターCは別プロセスで処理されるため、可用性も確保することができる。
なお、稼働実績蓄積部411において稼働実績を蓄積し、その稼働実績から各フィルターの信頼度を判定する方法を説明したが、ジョブ制御部402が予め各フィルターの信頼度を示す情報を設定ファイルに保持しても良い。信頼度の低いフィルターがあらかじめ分かっている場合には、ジョブ制御部402が各フィルターの信頼度を示す情報を設定ファイルに保持することで、サービス開始時から可溶性を確保するとともにパフォーマンスの劣化を抑制することができる。
また、信頼度判定式には式(1)を用いたが、これに限るものではない。例えば、信頼度判定式に、式(2)に示すようなMTBF(平均故障間隔)を用いても良い。
信頼度判定値=システムの稼働時間/異常終了回数 (2)
また、異常終了したフィルターを判定する例として、ジョブ制御部402が、フィルター制御部404から「フィルター変換完了通知」を受け取り、「フィルター変換完了数」を更新する方法を示したが、これに限るものではない。例えば、フィルター制御部404が、異常終了したフィルターを判定し、そのフィルター種別をダンプファイルとして書き出す機能を有し、ジョブ制御部402がそのダンプファイルを参照して、「異常終了フィルター通知」を送信してもよい。
また、上記においては1つのジョブの処理を完了するたびに、稼働実績を更新する例を示したが、これに限るものではない。例えば、1つのジョブに、複数の変換対象である入力データが含まれる場合には、入力データの処理を完了するたびに稼働実績を更新するようにしてもよい。例えば、変換対象である入力データのデータ量が大きく、ある単位で分割して処理する場合には、その分割された単位の処理が完了するたびに稼働実績を更新するようにしてもよい。
また、稼働実績が更新されるたびに、信頼度を判定する例を示したが、これに限るものではない。例えば、処理ジョブ数1303が、一定数(例えば1000回)増加するたびに信頼度を判定するようにしてもよい。
また、1つのジョブ毎に、フィルター制御部の個数、各フィルターがロードされるフィルター制御部名の決定し、フィルター制御部のクエリー(起動)を行ったが、これに限るものではない。例えば、「ジョブ種別情報」が同一であるジョブが続く場合には、フィルター制御部の個数、各フィルターがロードされるフィルター制御部名の決定およびフィルター制御部のクエリー(起動)は1度のみとしてもよい。「ジョブ種別情報」が同一であるジョブを処理する間も稼働実績の蓄積は行い、異常終了が発生した場合はフィルター制御部の個数、各フィルターがロードされるフィルター制御部名の決定およびフィルター制御部のクエリー(起動)を行えばよい。
(実施例5)
実施例4における「クラウドプリントサービス」のサービス開始時は、データ変換処理を構成する各コンポーネントを別プロセスとして起動する。起動後、各フィルターがクラッシュやハングアップした回数などを記録した稼働実績を蓄積し、稼働実績を基に信頼度を判定する。そして、所定値よりも信頼度が高いフィルターは、信頼度「高」として同一プロセスで起動し、所定値よりも信頼度が低いフィルターは、信頼度「低」として別プロセスで起動する。
しかし、実施例4における方法では、サービス開始初期、全てのコンポーネントが別プロセスとして処理されるため、パフォーマンスが劣化してしまう場合がある。
そこで、本実施例では、「クラウドプリントサービス」のサービス開始時は、データ変換処理を構成する各フィルターを同一プロセスとして起動する。その後、各フィルターがクラッシュやハングアップした回数などを記録した稼働実績を蓄積する。各フィルターの処理ジョブ数が、予め定められた一定数(20000回)を超えた以降から、稼働実績を基に信頼度を判定し、信頼度が高いフィルターは同一プロセスとして起動し、信頼度が低いフィルターは別プロセスとして起動する方法について説明する。
このように処理することで、サービス開始初期は、パフォーマンス劣化を最小限にして稼働実績を蓄積することができ、稼働実績蓄積後は、可用性を確保した上でパフォーマンスの劣化を抑制することができる。
ハードウェア構成、ソフトウェア構成、各コンポーネントの機能は、実施例4と共通のため、同一符号とし説明を省略する。
「クラウドプリントサービス」のサービス開始時は、データ変換処理を構成する各フィルターを同一プロセスとして起動するため、稼働実績が蓄積したテーブルは、図30で示すように、信頼度1305は全て「高」に設定する。
<正常終了する場合のデータ変換処理>
図31を用いて説明する。実施例1で説明した図28と同一の処理については、同一符号とし、説明を省略する。
S1601は、稼働実績蓄積部411が、問い合わせを受けた各フィルターの信頼度を、ジョブ制御部402のサービスIFを通じて、ジョブ制御部402へ回答する。フィルターAの信頼度は「高」、フィルターBの信頼度は「高」、フィルターCの信頼度は「高」と回答する。
S1602は、ジョブ制御部402が、各フィルターの信頼度をもとに、フィルター制御部404の個数および、各フィルターがロードされるフィルター制御部名を決定する。また、決定したフィルター制御部404の個数は設定ファイル(図5)の要素501のFilter Host num属性へ、各フィルターがロードされるフィルター制御部名を要素502のFilter Host name属性へ上書きする。ここでは、フィルター制御部404は1個、フィルターA405はフィルター制御部1、フィルターB406はフィルター制御部1、フィルターC407はフィルター制御部1にロードされるように上書きする。
S1603は、ジョブ制御部402が、プロセス情報管理部403に対して、設定ファイル(図5)にもとづき各フィルターに対応するフィルター制御部404のクエリー要求を行い、それぞれのエンドポイントを取得する。ここでは、フィルターA405、フィルターB406、フィルターC407をロードしたフィルター制御部1のエンドポイントを取得する。
S1604は、データ変換処理である。ジョブ制御部402は、初段のフィルター制御部1に接続されているパイプラインにデータを流した後、「フィルター変換完了数」を0に初期化する。フィルター制御部1は、フィルターAを用いてデータ変換処理を行う。フィルター制御部1は、フィルターAを用いたデータ変換処理が完了したらジョブ制御部402へ「フィルター変換完了通知」を送信する。ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。フィルター制御部1は、フィルターBを用いてデータ変換処理を行う。フィルター制御部1は、フィルターBを用いたデータ変換処理が完了したらジョブ制御部402へ「フィルター変換完了通知」を送信する。ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。フィルター制御部1は、フィルターCを用いてデータ変換処理を行う。
フィルター制御部1は、フィルターCを用いたデータ変換処理が完了したらジョブ制御部402へ「変換後データ」「フィルター変換完了通知」を送信する。ジョブ制御部402は、「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。
S1605は、稼働実績蓄積部411が、各フィルターの処理ジョブ数が、予め定められた一定数(20000回)を超えた以降、稼働実績を格納したテーブルが更新されるたびに、更新されたフィルターの信頼度の判定を行い、信頼度1305を上書きする。
以上説明したように、サービス開始初期は、信頼度が「高」であるフィルターAとフィルターBとフィルターCは、同一のプロセスで処理されプロセス間通信が発生しないため、パフォーマンスの劣化を最小限するとともに、稼働実績を蓄積ことができる。また、稼働実績蓄積後は、可用性を確保した上でパフォーマンスの劣化を抑制することができる。
<クラッシュ発生時>
図32は、データ変換処理中にクラッシュが発生した際の処理の流れを示した図である。図29で説明した処理フローのS607以降の処理で、クラッシュが発生した場合の処理フローである。
ここでは、フィルターA、フィルターB、フィルターCをロードしたフィルター制御部1がデータ変換を行う際に, フィルターAの変換を完了し、フィルターBの変換処理中にクラッシュしたものとして説明する。
実施例4で説明した図26と同一処理については同一符号とし、説明を省略する。
S1701は、フィルター制御部1がフィルターAを用いてデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。
S1702は、フィルター制御部1が、フィルターAを用いたデータ変換処理が完了したらジョブ制御部402へ「フィルター変換完了通知」を送信する。
S1703は、フィルター制御部1が、フィルターBを用いてデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。図32では、フィルターBを用いたデータ変換処理中にクラッシュしている。
S1704は、ジョブ制御部402が、フィルター制御部1から「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。ここでは、「フィルター変換完了数」は1に更新される。
S1705は、ジョブ制御部402が、フィルター制御部1のパイプラインの切断を検知する処理である。具体的には、フィルター制御部1、ジョブ制御部402間で定期的に生存確認のためのパケットを送り合い、パケットが途絶えたことをタイムアウトにより検知する。
S1706は、ジョブ制御部402が、パイプライン切断を示すログメッセージを、ログ出力部408に対して出力依頼する処理である。ログ出力部408は、このメッセージを受信し、ログファイルにパイプライン切断された旨を追記する。
S1707は、ジョブ制御部402が、設定ファイル(図5)およびフィルター変換完了数を参照し、クラッシュしたフィルターを判定する。ここでは、フィルター変換完了数は1となっており、設定ファイル項目502の2番目のフィルターBがクラッシュしたと判定する。
S1708は、稼働実績蓄積部411が、更新された各フィルターの処理ジョブ数が、予め定められた一定数(20000回)を超えた場合に、信頼度の判定を行う。
各フィルターの処理ジョブ数1303が、予め定められた一定数(20000回)を超えた場合は、稼働実績を基に信頼度を判定し、信頼度1305を上書きする。つまり、各フィルターの処理ジョブ数1302が、予め定められた一定数(20000回)以下である場合は、信頼度判定は行わないため、信頼度1305は初期値である「高」となっている。
以上のように、フィルター制御部1がクラッシュした場合であっても、他のコンポーネント(ジョブ制御部402、ジョブ処理受け付け部)はクラッシュせずに、パイプラインが切断した旨をログファイルに残すことができる。また、稼働実績を蓄積することができる。
<ハングアップ発生時>
図33は、データ変換処理中にハングアップが発生した際の処理の流れを示した図である。図29で説明した処理フローのS607以降の処理で、ハングアップが発生した場合の処理フローである。
ここでは、フィルターA、フィルターB、フィルターCをロードしたフィルター制御部1がデータ変換を行う際に, フィルターAの変換を完了し、フィルターBの変換処理中にハングアップしたものとして説明する。
実施例4で説明した図27と同一処理については同一符号とし、説明を省略する。
S1801は、フィルター制御部1がフィルターAを用いてデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。
S1802は、フィルター制御部1が、フィルターAを用いたデータ変換処理が完了したらジョブ制御部402へ「フィルター変換完了通知」を送信する。
S1803は、フィルター制御部1が、フィルターBを用いてデータ変換処理スレッドにて、ジョブのデータ変換を行う処理である。図33では、フィルターBを用いたデータ変換処理中にハングアップに陥るものとする。
S1804は、ジョブ制御部402が、フィルター制御部1から「フィルター変換完了通知」を受け取ると、「フィルター変換完了数」を1カウントアップする。ここでは、「フィルター変換完了数」は1に更新される。
S1805は、ジョブ制御部402が、設定ファイル(図5)およびフィルター変換完了数を参照し、ハングアップしたフィルターを判定する。ここでは、フィルター変換完了数は1となっており、設定ファイル項目502の2番目のフィルターBがハングアップしたと判定する。
S1806は、稼働実績蓄積部411が、更新された各フィルターの処理ジョブ数が、予め定められた一定数(20000回)を超えた場合に、信頼度の判定を行う。
各フィルターの処理ジョブ数1303が、予め定められた一定数(20000回)を超えた場合は、稼働実績を基に信頼度を判定し、信頼度1305を上書きする。つまり、各フィルターの処理ジョブ数1303が、予め定められた一定数(20000回)以下である場合は、信頼度判定は行わないため、信頼度1305は初期値である「高」となっている。以上のように、フィルター制御部1がハングアップした場合であっても、他のコンポーネント(ジョブ制御部402、ジョブ処理受け付け部)はハングアップせずに、パイプラインが切断した旨をログファイルに残すことができる。また、稼働実績を蓄積することができる。
以上説明したように処理することで、サービス開始初期は、パフォーマンスの劣化を最小限にして稼働実績を蓄積することができ、稼働実績蓄積後は、可用性を確保した上でパフォーマンスの劣化を抑制することができる。
(実施例6)
実施例4、5では稼働実績蓄積部411が、図22、図23、図30で示すように、「フィルター名1301」「バージョン1302」毎の動作実績を格納したテーブルを保持する例を説明した。
しかし、同じフィルターCでも、ジョブ種別「プリントサービスA用変換」では異常終了し易いが、ジョブ種別「プリントサービスC用変換」では異常終了しないといった動作実績となることが考えられる。
例えば、ジョブ種別「プリントサービスA用変換」における、前処理のフィルターBの出力値が、フィルターCで許容される入力形式に合致しておらず、かつ、フィルターCにおける入力値チェックが正しく実装されておらず異常終了する。しかし、種別「プリントサービスC用変換」における、前処理のフィルターZの出力値は、フィルターC、で許容される入力形式に合致しており、問題無く動作するといった場合である。
このような場合に、「フィルター名1301」「バージョン1302」毎の動作実績を基に信頼度を判定することは適切ではない。すなわち、ジョブ種別「プリントサービスC用変換」において、フィルターCは、一度も異常終了したことが無いのに、別プロセスで処理されてしまうことになる。そのため、パフォーマンスが劣化してしまうという問題がある。
そこで、本実施例では、稼働実績蓄積部411が、「ジョブ種別」「フィルター名1301」「バージョン1302」毎に、稼働実績を格納したテーブル保持するように変更する。その他の処理は、実施例4と同様であるため、説明を省略する。
このようにすることで、ジョブ種別「プリントサービスC用変換」においては、フィルターC、バージョン1.0.0.0は、信頼度「高」と判定され同一プロセスで処理されるため、パフォーマンス劣化は発生しない。
なお、図34の1902で示すように、稼働実績蓄積部411が、「前処理のフィルターと後処理のフィルターの順列」毎に、動作実績を格納したテーブル保持するように変更しても、同様の効果を得ることができる。
1903の列は前処理のフィルターのフィルター名を示し、1904の列は前処理のフィルターのバージョンを示し、1905の列は後処理のフィルターのフィルター名を示し、1906の列は後処理のフィルターのバージョンを示している。1907の行は、フィルターBが処理され、次にフィルターCが処理される場合の稼働実績を示している。また、1907の行は、ジョブ制御部402から入力データが入力され、フィルターAがジョブの一番初めに処理する場合の稼働実績を示している。
尚、上記実施例における各処理は、各処理を行うためのコンピュータプログラムが格納された記録媒体から、一般的なパーソナルコンピュータがコンピュータプログラムを読み取り、実行することによっても達成することが可能である。