以下、図面を参照して本発明の実施形態の一例を詳細に説明する。図1には本実施形態に係るサービス処理システム10が示されている。サービス処理システム10は、複数台のサービス処理サーバ12及び複数台のアプリケーション・サーバ14がコンピュータ・ネットワーク16を介して接続されて構成されている。
個々のアプリケーション・サーバ14は、CPU14A、ROMやRAM等から成るメモリ14B、HDD(Hard Disk Drive)等から成る記憶部14C、ネットワークI/F(インタフェース)部14Dを各々備えており、ネットワークI/F部14Dを介してコンピュータ・ネットワーク16に接続されている。個々のアプリケーション・サーバ14は、既存の別のコンピュータ・システムの一部を構成するコンピュータであり(なお既存の別のコンピュータ・システムとしては、例えば金融機関の基幹系システム(預為システムやその他のパッケージ・システム)が挙げられる)、個々のアプリケーション・サーバ14の記憶部14Cには、既存の別のコンピュータ・システム向けに所定のサービスを提供するための互いに異なるアプリケーション・プログラムがインストールされている。
一方、個々のサービス処理サーバ12は、CPU12A、ROMやRAM等から成るメモリ12B、HDD等から成る記憶部12C、ネットワークI/F(インタフェース)部12Dを各々備えており、ネットワークI/F部12Dを介してコンピュータ・ネットワーク16に接続されている。また、記憶部12Cにはサービス処理プログラムがインストールされており、更に処理状況テーブル(後述)も記憶されている。サービス処理プログラムは本発明に係るプログラムに対応しており、サービス処理サーバ12は、CPU12Aがサービス処理プログラムを実行することで、後述するサービス処理部(本発明に係るサービス処理装置)として機能する。
なお、図1では、複数台のサービス処理サーバ12のうち最上位のサービス処理部として機能するサービス処理サーバ12に、最上位のサービス処理部に対してサービスの実行を要求することを可能とする機器の一例として、オペレータが任意の情報を入力可能なキーボード18と、任意の情報を表示可能なディスプレイ20が接続された態様を示している。この態様では、オペレータがキーボード18を操作することで、オペレータから最上位のサービス処理部へサービスの実行が要求され、実行が要求されたサービスの処理結果はディスプレイ20に表示されてオペレータに視認される。但し、本発明は図1に示した態様に限られるものではなく、最上位のサービス処理部として機能するサービス処理サーバ12には、最上位のサービス処理部に対してサービスの実行を要求する機器が接続されていてもよい。前記サービスの実行を要求する機器としては、例えばバッチジョブのコントローラや、他のコンピュータ・システム、インターネット、ウェブサーバ等が挙げられる。この態様では、前記機器から最上位のサービス処理部へサービスの実行がオペレータの操作等を経ずに直接要求され、実行が要求されたサービスの処理結果は最上位のサービス処理部から前記機器へ直接通知される。
次に本実施形態の作用を説明する。本実施形態に係るサービス処理システム10は、SOAを適用し、提供すべきサービスを機能単位で分割し、分割した個々の機能のうち開発済みの機能(本実施形態では、サービス処理システム10に接続された個々のアプリケーション・サーバ14が提供するサービスがそれに相当する)についてはそれを流用して構築されており、互いに異なる機能を実現するサービス処理サーバ12(によって実現されるサービス処理部)が疎結合によって複数段連結され、サービス処理システム10に入力された個々のサービス要求を複数段のサービス処理部が連携して処理する構成とされている。また、本実施形態に係るサービス処理システム10は、個々のサービス処理サーバ12によって実現されるサービス処理部が図2に示すリファレンスモデルに準拠した構成となるように、個々のサービス処理サーバ12の記憶部12Cにインストールされるサービス処理プログラムが開発されている。
以下、まずサービス処理部のリファレンスモデルについて説明する。このリファレンスモデルでは、サービス処理部を、管理部24、処理実行部26、サービス受付部28、サービスID生成部30、サービス呼出部32、処理結果確認部34及び結果確認呼出部36の各機能ブロックに分割し、各機能ブロック毎の機能を規定することで、サービス処理システム10における障害等の発生時にデータの整合性を保証することを可能とするためにサービス処理部が備えているべき機能を規定している。
サービス処理部のリファレンスモデルにおいて、管理部24は、処理状況テーブル38を記憶する記憶部(ここでいう記憶部は、記憶部12Cの記憶領域のうち処理状況テーブル38等を記憶するために管理部24に割当てられた記憶領域を指す)を備え、サービス処理部に対して実行が要求されたサービス(に対応する自サービス及び下位サービス)の処理結果を、前記サービスを識別するサービスIDと対応付けて処理状況テーブル38で管理すると共に、下位サービスの処理結果の確認が必要な場合は、下位サービスの処理結果の確認を結果確認呼出部36へ要求する機能を備えている。また処理実行部26は、サービスIDが通知されてサービスの実行が要求されると、実行が要求されたサービスに対応する自サービスが有れば自サービスの処理を実行し、対応する下位サービスが有ればサービスID生成部30でサービスIDを生成させ、下位サービスの実行をサービス呼出部32へ要求する機能を備えている。
また、サービス受付部28は上位のサービス処理部が存在している場合に設けられ、サービスIDが付加されたサービス要求を上位のサービス処理部から受信することでサービスの実行が要求されると、実行が要求されたサービスの実行を処理実行部26に要求し、処理終了後に上位のサービス処理部へ応答を送信する機能を備えている。また、サービスID生成部30は下位のサービス処理部が存在している場合に設けられ、処理実行部26からの要求に応じて一意性を有するサービスIDを生成する機能を備えている。また、サービス呼出部32は下位のサービス処理部が存在している場合に下位のサービス処理部と同数個設けられ、処理実行部26からの要求に応じて下位サービスのサービスIDを付加したサービス要求を下位のサービス処理部へ送信する機能を備えている。
また、処理結果確認部34は上位のサービス処理部が存在している場合に設けられ、サービスIDが付加された処理結果確認要求を上位のサービス処理部から受信することでサービスの処理結果の確認が要求されると、処理結果の確認が要求されたサービスの処理結果をサービスIDを用いて管理部24に確認し、処理結果の確認が終了すると確認した処理結果を上位のサービス処理部へ通知する機能を備えている。更に、結果確認呼出部36は下位のサービス処理部が存在している場合に下位のサービス処理部と同数個設けられ、要求に応じて、確認対象の下位サービスのサービスIDを付加した処理結果確認要求を下位のサービス処理部へ送信する機能を備えている。
次に、サービス処理部の各機能ブロック(管理部24、処理実行部26、サービス受付部28、サービスID生成部30、サービス呼出部32、処理結果確認部34及び結果確認呼出部36)が上述した機能を備えていることで実現される、サービス処理部内における典型的な処理シーケンスを説明する。
上位のサービス処理部が存在するサービス処理部が、上位のサービス処理部からサービス要求を受信した場合、サービス要求を受信したサービス処理部では、各機能ブロックが連動することで図3に示す処理シーケンスで処理が行われる。すなわち、上位のサービス処理部からサービスIDが付加されたサービス要求を受信すると((1)参照)、サービス受付部28は、処理実行部26に対してサービスIDを通知してサービスの実行を要求する((2)参照)。処理実行部26は実行が要求されたサービスの処理結果を管理部24に確認する((3)参照)。そして、確認した処理結果が「処理済」であればサービス受付部28へ直ちに応答を返す((12)参照)が、確認した処理結果が「未済」で、かつ実行が要求されたサービスに対応する自サービスが存在している場合は、自サービスの処理を実行し、処理結果をサービスIDと対応付けて処理状況テーブル38に記録させる((4)参照)。
また、実行が要求されたサービスに対応する下位サービスが存在しており、かつ当該下位サービスが「処理済」でない場合、処理実行部26はサービスID生成部30によって下位サービスのサービスIDを生成させ((5)参照)、生成された下位サービスのサービスIDを処理状況テーブル38に記録させ((6)参照)、。サービス呼出部32に対して下位サービスのサービスIDを通知して下位サービスの実行を要求する((7)参照)。これにより、サービス呼出部32は通知された下位サービスのサービスIDを付加したサービス要求を下位のサービス処理部へ送信する((8)参照)。また、下位のサービス処理部から応答を受信すると((9)参照)、受信した応答によって通知された下位サービスの処理結果を処理状況テーブル38に記録させ((10)参照)、処理終了を処理実行部26へ通知する((11)参照)。これを受けて処理実行部26はサービス受付部28へ処理結果を通知し((12)参照)、サービス受付部28は上位のサービス処理部へ応答を送信することで処理結果を通知する((13)参照)。
また、上位のサービス処理部が存在するサービス処理部が、上位のサービス処理部から処理結果確認要求を受信した場合、サービス要求を受信したサービス処理部では、各機能ブロックが連動することで図4に示す処理シーケンスで処理が行われる。すなわち、上位のサービス処理部から処理結果確認要求を受信すると((1)参照)、処理結果確認部34は、受信した処理結果確認要求によって処理結果の確認が要求されたサービスに対応する各サービスの処理結果を管理部24に確認する((2)参照)。そして、対応する各サービスの中に処理結果が「不明」の下位サービスが無ければ上位のサービス処理部へ直ちに応答を返す((8)参照)が、処理結果が「不明」の下位サービスが存在している場合は、対応する結果確認呼出部36に対し、下位サービスの処理結果の確認を要求する((3)参照)。
結果確認呼出部36は、下位サービスの処理結果の確認が要求されると、下位のサービス処理部へ処理結果確認要求を送信する((4)参照)。また、下位のサービス処理部から下位サービスの処理結果を通知する応答を受信すると((5)参照)、通知された下位サービスの処理結果を処理状況テーブル38に記録させ((6)参照)、管理部24から処理結果確認部34に確認された処理結果が通知される((7)参照)。これを受けて処理結果確認部34は、通知された下位サービスの処理結果を含む処理結果を通知する応答を上位のサービス処理部へ送信する((8)参照)。
次に図5を参照し、上記のサービス処理部のリファレンスモデルに準拠して構築されたサービス処理システム10のソフトウェアの構成の一例を説明する。図5に示すように、本実施形態に係るサービス処理システム10は、5個のサービス処理部が3層(3段)に分けられており、3層目(3段目)の3個のサービス処理部が2層目(2段目)の単一のサービス処理部に各々連結され、2層目(2段目)の単一のサービス処理部が1層目(1段目)の単一のサービス処理部に連結されて構成されている。
1層目(最上位)のサービス処理部は、より上位のサービス処理部が存在しないため、サービス処理部のリファレンスモデルに対してサービス受付部28及び処理結果確認部34が省略されている。なお、以下では最上位のサービス処理部を便宜上「リクエスタ42」と称する。リクエスタ42として機能するサービス処理サーバ12にキーボード18及びディスプレイ20が接続されている場合、リクエスタ42は、オペレータによってキーボード18が操作されることで入力された指示に応じて、下位のサービス処理部へサービス要求や処理結果確認要求を送信すると共に、下位のサービス処理部からの応答に基づきディスプレイ20に処理結果等を表示する処理を行う。なお、リクエスタ42として機能するサービス処理サーバ12にサービスの実行を要求する機器(例えばバッチジョブのコントローラや、他のコンピュータ・システム、インターネット、ウェブサーバ等)が接続されている場合には、リクエスタ42により、前記機器から要求を受信し、受信した要求に応じて下位のサービス処理部へサービス要求や処理結果確認要求を送信すると共に、下位のサービス処理部からの応答に基づき処理結果等を前記機器へ通知する処理が行われることになる。
また、2層目のサービス処理部は、下位のサービス処理部が3個存在しているため、サービス呼出部32及び結果確認呼出部36の組が3組設けられている。本実施形態では、2層目のサービス処理部のプログラムが、BPELエンジンと称されるBPEL(Business Process Execution Language)のプラットフォーム上で動作するプログラムとして開発されており、2層目のサービス処理部として機能するサービス処理サーバ12の記憶部12Cには、上記のプラットフォームとして機能する所定のプログラムもインストールされている。以下では2層目のサービス処理部を便宜上「BPEL44」と称する。BPEL44は、リクエスタ42から受信したサービス要求や処理結果確認要求に従い、下位の個々のサービス処理部へサービス要求や処理結果確認要求を送信したり、障害発生時にデータの整合性を保証するための処理を行う。
また3層目には、3個のサービス処理部として、既存の別のコンピュータ・システム(のアプリケーション・サーバ14)と接続されていないサービス処理部と、既存の別のコンピュータ・システムとしてのパッケージ・システム66(のアプリケーション・サーバ14)と接続されたサービス処理部と、既存の別のコンピュータ・システムとしての預為システム68(のアプリケーション・サーバ14)と接続されたサービス処理部が存在している。これらのサービス処理部は、より下位のサービス処理部が存在しないため、サービス処理部のリファレンスモデルに対してサービス呼出部32及び結果確認呼出部36が省略されている。
3層目の3個のサービス処理部のうち、既存システムと接続されていないサービス処理部は、処理実行部26によって行われる処理単独で一定のサービスが実現されるサービス処理部であり、以下では当該サービス処理部を便宜上「プロバイダ46」と称する。
また3層目の3個のサービス処理部のうち、パッケージ・システム66(のアプリケーション・サーバ14)と接続されたサービス処理部には、サービス処理システム10とパッケージ・システム66とのインタフェースを司る機能ブロックとして、サービス処理システム10内のサービスIDを代替するIDとしてパッケージ・システム66固有のIDの採番を行うID変換部52と、データ形式の相互変換を行う機能を各々備えパッケージ・システム66と通信を行うことでサービスを実行させたり処理結果の確認を行うパッケージ呼出部54及び結果確認呼出部56が設けられている。以下では当該サービス処理部を便宜上「パッケージ・ラッパー48」と称する。
また3層目の3個のサービス処理部のうち、預為システム68(のアプリケーション・サーバ14)と接続されたサービス処理部には、サービス処理システム10と預為システム68とのインタフェースを司る機能ブロックとして、サービス処理システム10内のサービスIDを代替するIDとして預為システム68固有のIDである端末番号の採番を行う端末管理部58と、データ形式の相互変換を行う機能を各々備え預為システム68と通信を行うことでサービスを実行させたり処理結果の確認(取引状況の照会)を行うMB通信部60及び取引状況照会部62が設けられている。以下では当該サービス処理部を便宜上「MBラッパー50」と称する。
なお、本実施形態では説明の都合上、サービス処理システム10の3層目のサービス処理部であるプロバイダ46、パッケージ・ラッパー48及びMBラッパー50のうち、プロバイダ46によって提供されるサービスと、MBラッパー50(及び預為システム68)によって提供されるサービスは冪等性を有している一方、パッケージ・ラッパー48(及びパッケージ・システム66)によって提供されるサービスは冪等性を有していないものとする。なお、冪等性を有するサービスは何度実行しても結果が同じになるサービスであり、例えばDB(データベース)の一定領域に格納されているデータを読み出して出力するサービス等が挙げられる。また、冪等性を有しないサービス(非冪等のサービス)は実行の度に結果が相違するサービスであり、例えばDBの一定領域に格納されている数値を実行の度に1ずつインクリメントして結果を出力するサービス等が挙げられる。
また、図3において、下位のサービス処理部が存在する個々のサービス処理部(リクエスタ42及びBPEL44)に設けられたサービスID生成部30は、本発明に係るID要素生成手段及びサービスID生成・付加手段に各々対応している。
次に、サービス処理部の各機能ブロックにおける処理について、図6〜図15のフローチャートを参照して説明する。上位のサービス処理部が存在するサービス処理部は、上位のサービス処理部から、サービスの実行を要求するサービス要求及び実行を要求したサービスの処理結果の確認を要求する処理結果確認要求を受信するが、上位のサービス処理部が存在するサービス処理部にはサービス受付部28が設けられており、このサービス受付部28は、上位のサービス処理部からサービス要求を受信する際に図6に示すサービス受付部処理を行う。
このサービス受付部処理では、まずステップ80で上位のサービス処理部からサービス要求の電文を受信し、次のステップ82において、上位のサービス処理部からサービス要求の電文を受信したことを表すステータス情報を、受信した電文と共に管理部24の処理状況テーブル38に記憶させる。なお、受信した電文には、実行が要求されたサービスのサービスIDが付加されており、上記処理によりサービスIDも処理状況テーブル38に記憶される。次のステップ84では受信した電文の内容をチェックし、受信した電文の内容を適正か否か判定する。判定が否定された場合はステップ86へ移行し、上位のサービス処理部へ送信する応答電文にエラーメッセージを設定し、ステップ90へ移行する。
一方、受信した電文の内容が適正であった場合は、ステップ84の判定が肯定されてステップ88へ移行し、受信したサービス要求の電文に付加されていたサービスIDを引数として処理実行部26のAPIを呼び出し、サービスの実行を要求する。これにより、処理実行部26で処理実行部処理(後述)が行われる。処理実行部26による処理実行部処理が終了し、実行を要求したサービスの処理結果が通知されると、通知された処理結果を上位のサービス処理部へ送信する応答電文に設定した後にステップ90へ移行する。ステップ90では、ステップ86又はステップ88で生成した応答電文を上位のサービス処理部へ送信する。またステップ92では、上位のサービス処理部へ応答電文を送信したことを表すステータス情報を、送信した応答電文と共に管理部24の処理状況テーブル38に記憶させ、サービス受付部処理を終了する。
次に、サービスの実行が要求されると処理実行部26で行われる処理実行部処理について説明する。なお、処理実行部処理の内容は、上位のサービス処理部の有無や、下位のサービス処理部の有無及び数、下位のサービス処理部による下位サービスの冪等性の有無、サービスの実行を要求する呼び出しが仮想冪等機能(実際のサービスが冪等性を有しているか否かに拘わらず、サービスの実行が何度要求されても同じ結果が得られるようにする機能)を利用する呼び出し(以下、これを冪等呼び出しと称する)か仮想冪等機能を利用しない呼び出し(以下、これを非冪等呼び出しと称する)か、補償処理(後述)を行うか否か、等の条件に応じて大きく相違する。このため、以下では処理実行部処理の一例として、BPEL44の処理実行部26における代表的な処理を、図7〜図10を参照して順に説明する。なお、図7〜図10に示した処理実行部処理は、何れも、プロバイダ46、パッケージ・ラッパー48及びMBラッパー50の各々による下位サービスの実行を必要とするサービスの実行が要求されることを前提としている。なお、処理実行部26の呼び出し時には引数として冪等フラグ(FLG)も処理実行部26に引き渡され、この冪等フラグの値が1か0かによって冪等呼び出しと非冪等呼び出しが区別される。
図7に示す処理実行部処理は、BPEL44の処理実行部26に対して冪等呼び出しによってサービスの実行が要求され、処理実行部26で補償処理を行わない、という条件での処理実行部処理の一例である。図7に示す態様では、処理実行部26のプログラムが、処理実行部APIと業務プログラムに分かれている。処理実行部APIは、処理実行部26の機能を実現する処理のうちの定型処理を行うプログラムであり、図7の例では、下位のサービス処理部(この例ではプロバイダ46、パッケージ・ラッパー48及びMBラッパー50)からの応答のタイムアウトの監視(サービス要求を送信してから応答未受信の状態が規定時間以上継続したかを監視)、下位のサービス処理部へのサービス要求等のリトライ(例えば処理結果が「不明」等の場合のサービス要求の再送信等)、リトライ回数の監視(サービス要求等の送信回数が規定回数に達した場合に「異常」として処理する)等の処理が処理実行部APIによって行われる。
なお、上記のように処理実行部のプログラムを処理実行部APIと業務プログラムに分けることで、処理実行部APIを部品化し、業務プログラムの処理内容が相違する処理実行部26の開発する際にも、部品化した処理実行部APIを流用することで、プログラム開発者が業務プログラムの開発に専念できるので、プログラム開発者の負担の軽減、プログラム開発に要する期間の短縮を実現することができる。
図7において、処理実行部26のプログラムのうち業務プログラムによって実現される処理(以下、この処理を単に処理実行部処理と称する)は、処理実行部API経由で外部から呼び出されることで起動される。仮想冪等機能を利用する冪等呼び出しでは、同一のサービスIDのサービスの実行が繰り返し要求される可能性があるので、まずステップ200では、呼出時に引数として引き渡されたサービスIDを管理部24に通知し、通知したサービスIDのサービスの実行が前回要求された際の処理結果(状況)を管理部24に問い合わせる。次のステップ202では管理部24から通知された情報に基づき、同一のサービスIDのサービスの実行が前回要求された際の処理が「処理中」か否か判定し、「処理中」であれば処理実行部APIに制御を戻す。
また、同一のサービスIDのサービスの実行が前回要求された際の処理が「処理中」でない場合(引数として引き渡されたサービスIDのサービスの実行が過去に要求されていない場合や、同一のサービスIDのサービスの実行が前回要求された際の処理が終了している場合がこの条件に該当する)はステップ204へ移行する。下位サービス1は冪等性を有しているので、ステップ204では、下位サービス1の処理状況に拘わらず(下位サービス1が今回引数として引き渡されたサービスIDのサービスに対応する下位サービスとして過去に実行されているか否かや、下位サービス1が今回引数として引き渡されたサービスIDのサービスに対応する下位サービスとして過去に実行されている場合の処理結果等に拘わらず)、下位サービス1(ここではプロバイダ46による下位サービス)の実行を、下位サービス1に対応するサービス呼出部32へ指示する。これにより、下位サービス1に対応するサービス呼出部32ではサービス呼出部処理(後述)が行われ、プロバイダ46へサービス要求が送信される。
なお、今回引数として引き渡されたサービスIDのサービスの実行が過去に要求されていない場合は、サービス呼出部32への指示に先立ち、引数として引き渡されたサービスIDをサービスID生成部30へ通知して下位サービス1のサービスIDの生成を要求し、サービスID生成部30で生成された下位サービス1のサービスIDを、管理部24を通じ、引数として引き渡されたサービスIDと対応付けて処理状況テーブル38に記憶させると共に、当該下位サービス1のサービスIDをサービス呼出部32へ通知する処理も行われる。また、同一のサービスIDのサービスの実行が過去に要求されている場合は、サービス呼出部32への指示に先立ち、管理部24から通知された情報より対応する下位サービス1のサービスIDを抽出し、抽出したサービスIDをサービス呼出部32へ通知する処理も行われる。
また、下位サービス1に対応するサービス呼出部32から処理結果が通知されると、次のステップ206において、通知された処理結果に応じて処理を分岐する。すなわち、通知された処理結果が「不明」又は「処理未済」である場合は、処理実行部APIに制御を戻す。この場合、処理実行部APIによってリトライやリトライ回数の監視等の処理が行われる。また、通知された処理結果が「業務エラー」である場合は、処理結果が「業務エラー」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス2,3の実行を要求するサービス要求の送信はスキップされる。
一方、通知された処理結果が「処理済」である場合は、下位サービス1の処理が正常に終了しているのでステップ210へ移行する。下位サービス2(ここではパッケージ・ラッパー48による下位サービス)は冪等性を有していないので、まずステップ210では、今回引数として引き渡されたサービスIDを管理部24に通知し、通知したサービスIDのサービスの処理結果(状況)を管理部24に問い合わせる。そして、次のステップ212では、管理部24から通知された情報に基づいて、下位サービス2が今回引数として引き渡されたサービスIDのサービスに対応する下位サービスとして過去に実行されている場合の処理結果を判定し、判定した処理結果に応じて処理を分岐する。なお、先のステップ200,202において、今回引数として引き渡されたサービスIDのサービスの実行が過去に要求されていないことが判明した場合は、ステップ210の実行をスキップし、ステップ212で処理結果は「処理未済」と判定するようにしてもよい。
ステップ212で判定した処理結果が「不明」又は「確認不能」(例えば管理部24から結果確認呼出部36へ下位サービス2の処理結果の確認が要求されたものの、パッケージ・ラッパー48との通信リンクが確立していなかった等の場合))である場合は、処理実行部APIに制御を戻す。この場合、処理実行部APIによって(処理結果確認の)リトライやリトライ回数の監視等の処理が行われる。また、判定した処理結果が「業務エラー」である場合は、処理結果が「業務エラー」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス3の実行を要求するサービス要求の送信はスキップされる。また、判定した処理結果が「処理済」である場合は、下位サービス2の実行を要求するサービス要求の送信をスキップしてステップ220へ移行する。
一方、判定した処理結果が「処理未済」である場合はステップ214へ移行し、まず引数として引き渡されたサービスIDをサービスID生成部30へ通知して下位サービス2のサービスIDの生成を要求し、サービスID生成部30で生成された下位サービス2のサービスIDを、管理部24を通じ、引数として引き渡されたサービスIDと対応付けて処理状況テーブル38に記憶させると共に、当該下位サービス2のサービスIDを下位サービス2に対応するサービス呼出部32へ通知し、下位サービス2の実行を指示する。これにより、下位サービス2に対応するサービス呼出部32ではサービス呼出部処理(後述)が行われ、パッケージ・ラッパー48へサービス要求が送信される。
また、下位サービス2に対応するサービス呼出部32から処理結果が通知されると、次のステップ216において、通知された処理結果に応じて処理を分岐する。すなわち、通知された処理結果が「不明」又は「処理未済」である場合は、処理実行部APIに制御を戻す。この場合、処理実行部APIによってリトライやリトライ回数の監視等の処理が行われる。また、通知された処理結果が「業務エラー」である場合は、処理結果が「業務エラー」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス3の実行を要求するサービス要求の送信はスキップされる。
一方、通知された処理結果が「処理済」である場合は、下位サービス2の処理も正常に終了しているのでステップ220へ移行する。下位サービス3は冪等性を有しているので、ステップ220では、先のステップ204と同様に下位サービス3の処理状況に拘わらず、下位サービス3(ここではMBラッパー50による下位サービス)の実行を、下位サービス3に対応するサービス呼出部32へ指示する。これにより、下位サービス3に対応するサービス呼出部32ではサービス呼出部処理(後述)が行われ、MBラッパー50へサービス要求が送信される。
なお、今回引数として引き渡されたサービスIDのサービスの実行が過去に要求されていない場合は、サービス呼出部32への指示に先立ち、引数として引き渡されたサービスIDをサービスID生成部30へ通知して下位サービス3のサービスIDの生成を要求し、サービスID生成部30で生成された下位サービス3のサービスIDを、管理部24を通じ、引数として引き渡されたサービスIDと対応付けて処理状況テーブル38に記憶させると共に、当該下位サービス3のサービスIDをサービス呼出部32へ通知する処理も行われる。また、同一のサービスIDのサービスの実行が過去に要求されている場合は、サービス呼出部32への指示に先立ち、管理部24から通知された情報より対応する下位サービス3のサービスIDを抽出し、抽出したサービスIDをサービス呼出部32へ通知する処理も行われる。
また、下位サービス3に対応するサービス呼出部32から処理結果が通知されると、次のステップ222において、通知された処理結果に応じて処理を分岐する。すなわち、通知された処理結果が「不明」又は「処理未済」である場合は、処理実行部APIに制御を戻す。この場合、処理実行部APIによってリトライやリトライ回数の監視等の処理が行われる。また、通知された処理結果が「業務エラー」である場合は、処理結果が「業務エラー」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。また、一方、通知された処理結果が「処理済」である場合は、下位サービス3の処理も正常に終了しているので、処理結果が「処理済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。
続いて、図8に示す処理実行部処理について、図7に示す処理実行部処理と異なる部分のみ説明する。図8に示す処理実行部処理は、図7に示す処理実行部処理と同様に、BPEL44の処理実行部26に対して冪等呼び出しによってサービスの実行が要求され、処理実行部26で補償処理を行わない、という条件に対応しており、下位のサービス処理部へのサービス要求等のリトライ及びリトライ回数の監視が、処理実行部APIに代えて業務プログラムによって行われる点で図7に示す処理実行部処理と相違している。
すなわち、図8に示す処理実行部処理では、ステップ204で下位サービス1に対応するサービス呼出部32へ下位サービス1の実行を指示し、ステップ206で下位サービス1に対応するサービス呼出部32から通知された処理結果が「不明」又は「処理未済」であった場合に、ステップ208において、下位サービス1を行うプロバイダ46へサービス要求を送信した回数が規定値に達したか否かを判定することで、プロバイダ46へのサービス要求の再送信(リトライ)を行うか否か判定する。プロバイダ46へのサービス要求の送信回数が規定値未満の場合はステップ204に戻り、下位サービス1に対応するサービス呼出部32へ下位サービス1の実行を再度指示することで、プロバイダ46へサービス要求を再送信させる。また、プロバイダ46へのサービス要求の送信回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス2,3の実行を要求するサービス要求の送信はスキップされる。
また、図8に示す処理実行部処理では、ステップ210でサービスの処理結果(状況)を管理部24に問い合わせ、ステップ212で判定した下位サービス2の処理結果が「不明」又は「確認不能」であった場合、及び、ステップ214で下位サービス2に対応するサービス呼出部32へ下位サービス2の実行を指示し、ステップ216で下位サービス2に対応するサービス呼出部32から通知された処理結果が「不明」又は「処理未済」であった場合に、ステップ218において、下位サービス2の処理結果を確認した回数又はパッケージ・ラッパー48へサービス要求を送信した回数が規定値に達したか否かを判定することで、上記処理を再度行うか否か判定する。下位サービス2は冪等性を有していないので、下位サービス2の処理結果を確認した回数又はパッケージ・ラッパー48へサービス要求を送信した回数が規定値未満の場合はステップ210に戻り、下位サービス2の処理結果確認以降の処理を再度行う。また、下位サービス2の処理結果を確認した回数又はパッケージ・ラッパー48へサービス要求を送信した回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス3の実行を要求するサービス要求の送信はスキップされる。
また、図8に示す処理実行部処理では、ステップ220で下位サービス3に対応するサービス呼出部32へ下位サービス3の実行を指示し、ステップ222で下位サービス3に対応するサービス呼出部32から通知された処理結果が「不明」又は「処理未済」であった場合に、ステップ224において、下位サービス3を行うMBラッパー50へサービス要求を送信した回数が規定値に達したか否かを判定することで、MBラッパー50へのサービス要求の再送信(リトライ)を行うか否か判定する。MBラッパー50へのサービス要求の送信回数が規定値未満の場合はステップ220に戻り、下位サービス3に対応するサービス呼出部32へ下位サービス3の実行を再度指示することで、MBラッパー50へサービス要求を再送信させる。また、MBラッパー50へのサービス要求の送信回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。
続いて、図9に示す処理実行部処理について、図7に示す処理実行部処理と異なる部分のみ説明する。図9に示す処理実行部処理は、BPEL44の処理実行部26に対して冪等呼び出しによってサービスの実行が要求され、処理実行部26で補償処理を行う、という条件に対応しており、下位のサービス処理部からの応答のタイムアウトの監視、下位のサービス処理部へのサービス要求等のリトライ及びリトライ回数の監視等の処理は、図7に示す処理実行部処理と同様に処理実行部APIによって行われる。
図9に示す処理実行部処理では、ステップ210でサービスの処理結果(状況)を管理部24に問い合わせ、ステップ212で判定した下位サービス2の処理結果が「業務エラー」であった場合、及び、ステップ214で下位サービス2に対応するサービス呼出部32へ下位サービス2の実行を指示し、ステップ216で下位サービス2に対応するサービス呼出部32から通知された処理結果が「業務エラー」であった場合にステップ230へ移行する。この場合、今回引数として引き渡されたサービスIDのサービスに対応する下位サービスのうち、下位サービス1は処理結果が「処理済」であるのに対し、下位サービス2は処理結果が「業務エラー」で処理が未了であるので、データに矛盾が生じている。
このため、ステップ230では、データの整合性をとるために、下位サービス1に対応するサービス呼出部32に対し、下位サービス1のサービスIDとして先のステップ204と同一のサービスIDを通知し、当該サービスIDの下位サービス1として先に実行した処理を取り消す処理の実行を要求するサービス要求の送信を指示する。これにより、下位サービス1に対応するサービス呼出部32ではサービス呼出部処理(後述)が行われ、プロバイダ46へ上記のサービス要求が送信される。そして、先に実行した処理を取り消す処理がプロバイダ46によって行われることで、先に実行した処理で更新されたデータがあれば当該データが元のデータへ復元され、データの矛盾が解消される(データの整合性が確保される)ことになる。
また、下位サービス1に対応するサービス呼出部32から処理結果が通知されると、次のステップ232において、通知された処理結果に応じて処理を分岐する。すなわち、通知された処理結果が「処理済」の場合は、処理結果が「業務エラー」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。また通知された処理結果が「業務エラー」又は「処理未済」又は「不明」の場合は、処理結果が「取消失敗」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合は、データの矛盾が解消して整合性が確保する処理は、バッチ処理等の別処理によって行われることになる。
また、図9に示す処理実行部処理では、ステップ220で下位サービス3に対応するサービス呼出部32へ下位サービス3の実行を指示し、ステップ222で下位サービス3に対応するサービス呼出部32から通知された処理結果が「業務エラー」であった場合にステップ226へ移行する。この場合、今回引数として引き渡されたサービスIDのサービスに対応する下位サービスのうち、下位サービス1,2は処理結果が「処理済」であるのに対し、下位サービス3は処理結果が「業務エラー」で処理が未了であるので、データに矛盾が生じている。
このため、ステップ226では、データの整合性をとるために、下位サービス2に対応するサービス呼出部32に対し、下位サービス2のサービスIDとして先のステップ214と同一のサービスIDを通知し、当該サービスIDの下位サービス2として先に実行した処理を取り消す処理の実行を要求するサービス要求の送信を指示する。これにより、下位サービス2に対応するサービス呼出部32ではサービス呼出部処理(後述)が行われ、パッケージ・ラッパー48へ上記のサービス要求が送信される。そして、先に実行した処理を取り消す処理がパッケージ・ラッパー48によって行われることで、先に実行した処理で更新されたデータがあれば、当該データが元のデータへ復元される。
また、下位サービス2に対応するサービス呼出部32から処理結果が通知されると、次のステップ228において、通知された処理結果に応じて処理を分岐する。通知された処理結果が「業務エラー」又は「処理未済」又は「不明」の場合は、処理結果が「取消失敗」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合は、データの矛盾が解消して整合性が確保する処理は、バッチ処理等の別処理によって行われる。また、通知された処理結果が「処理済」の場合はステップ230へ移行し、ステップ230で前述した処理が行われることで、先に実行した処理を取り消す処理の実行を要求するサービス要求がプロバイダ46へも送信される。そして、先に実行した処理を取り消す処理がプロバイダ46でも行われ、先に実行した処理で更新されたデータがあれば当該データが元のデータへ復元されることでデータの矛盾が解消される(データの整合性が確保される)ことになる。
続いて、図10に示す処理実行部処理について、図7〜図9に示す処理実行部処理と異なる部分のみ説明する。図10に示す処理実行部処理は、BPEL44の処理実行部26に対して非冪等呼び出しによってサービスの実行が要求され、処理実行部26で補償処理を行う、という条件に対応している。また、図10に示す処理実行部処理では、図7に示す処理実行部処理と同様に、下位のサービス処理部へのサービス要求等のリトライ及びリトライ回数の監視等の処理が業務プログラムによって行われる一方、タイムアウトの監視が処理実行部APIによって行われる。
仮想冪等機能を利用しない非冪等呼び出しでは、同一のサービスIDのサービスの実行が複数回要求されることはないので、図10に示す処理実行部処理ではステップ200,202が省略されており、まずステップ204で下位サービス1に対応するサービス呼出部32へ下位サービス1の実行を指示する。また、次のステップ206で下位サービス1に対応するサービス呼出部32から通知された処理結果が「不明」又は「処理未済」であった場合、図8に示す処理実行部処理と同様に、ステップ208でプロバイダ46へのサービス要求の再送信(リトライ)を行うか否か判定する。プロバイダ46へのサービス要求の送信回数が規定値未満の場合はステップ204に戻り、下位サービス1に対応するサービス呼出部32へ下位サービス1の実行を再度指示することで、プロバイダ46へサービス要求を再送信させる。また、プロバイダ46へのサービス要求の送信回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス2,3の実行を要求するサービス要求の送信はスキップされる。
また、図10に示す処理実行部処理では、ステップ206で下位サービス1に対応するサービス呼出部32から通知された処理結果が「処理済」であった場合、次のステップ236で下位サービス2に対応するサービス呼出部32へ下位サービス2の実行を指示する。また、下位サービス2に対応するサービス呼出部32から処理結果が通知されるとステップ238へ移行し、通知された下位サービス2の処理結果に応じて処理を分岐する。すなわち、通知された処理結果が「業務エラー」の場合はステップ230へ移行し、図9に示す処理実行部処理と同様に、下位サービス1の実行要求に従ってプロバイダ46が先に実行した処理を取り消す処理をプロバイダ46によって行わせる。また、通知された処理結果が「処理済」の場合はステップ220へ移行する。
一方、通知された処理結果が「不明」又は「処理未済」の場合は、下位サービス2が冪等性を有しておらず、かつ図10に示す処理実行部処理が非冪等呼び出しで呼び出されることを考慮し、ステップ240で下位サービス2の処理結果を管理部24に問い合わせ、次のステップ242で下位サービス2の処理結果を判定し、判定した処理結果に応じて処理を分岐する。そして、ステップ240,242の処理を経て下位サービス2の処理結果が「業務エラー」に切り替わった場合はステップ230へ移行する。また、ステップ240,242の処理を経て下位サービス2の処理結果が「処理済」に切り替わった場合はステップ220へ移行する。下位サービス2の処理結果が「不明」の場合は対処の判断が困難であるが、上記のように処理結果を再確認した結果、処理結果が「業務エラー」又は「処理済」に切り替わった場合は対処の判断が容易となる。また、ステップ242で判定した下位サービス2の処理結果が「不明」又は「確認不能」であった場合はステップ240に戻り、ステップ240,242の処理を再度行う。
一方、ステップ242で判定した下位サービス2の処理結果が「処理未済」であった場合はステップ244へ移行し、パッケージ・ラッパー48へのサービス要求の再送信(リトライ)を行うか否か判定する。パッケージ・ラッパー48へのサービス要求の送信回数が規定値未満の場合はステップ236に戻り、下位サービス2に対応するサービス呼出部32へ下位サービス2の実行を再度指示することで、パッケージ・ラッパー48へサービス要求を再送信させる。また、パッケージ・ラッパー48へのサービス要求の送信回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。この場合、下位サービス3の実行を要求するサービス要求の送信はスキップされる。
また、ステップ220では下位サービス3に対応するサービス呼出部32へ下位サービス3の実行を指示する。また、次のステップ222で下位サービス3に対応するサービス呼出部32から通知された処理結果が「不明」又は「処理未済」であった場合、図8に示す処理実行部処理と同様に、ステップ224でMBラッパー50へのサービス要求の再送信(リトライ)を行うか否か判定する。MBラッパー50へのサービス要求の送信回数が規定値未満の場合はステップ220に戻り、下位サービス3に対応するサービス呼出部32へ下位サービス3の実行を再度指示することで、MBラッパー50へサービス要求を再送信させる。また、MBラッパー50へのサービス要求の送信回数が規定値に達した場合は、処理結果が「不明」又は「処理未済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。
また、図10に示す処理実行部処理では、ステップ222で下位サービス3に対応するサービス呼出部32から通知された処理結果が「業務エラー」の場合はステップ226へ移行し、図9に示す処理実行部処理と同様に、下位サービス2の実行要求に従ってパッケージ・ラッパー48が先に実行した処理を取り消す処理をパッケージ・ラッパー48によって行わせ、続いて、下位サービス1の実行要求に従ってプロバイダ46が先に実行した処理を取り消す処理をプロバイダ46によって行わせる。また、通知された処理結果が「処理済」の場合は処理結果が「処理済」であることを処理実行部APIを通じて処理実行部26の呼出元へ通知する。
なお、図7〜図10では、実行が要求されたサービスに対応する自サービスが存在しない場合の処理実行部処理を示しているが、実行が要求されたサービスに対応する自サービスが存在する場合は、処理実行部26により、対応する自サービスの処理を実行し、処理結果を引数として引き渡されたサービスIDと対応付けて処理状況テーブル38に記憶させる処理も行われる。
また、下位のサービス処理部が存在するサービス処理部にはサービスID生成部30が設けられており、サービスID生成部30は処理実行部26からサービスIDの生成が要求される毎に、図11に示すサービスID生成部処理を行う。
このサービスID生成部処理では、まずステップ100において、自身(サービスID生成部30)を含むサービス処理部(自サービス処理部)に固有のIDをリクエスタ固有IDとして取得する。自サービス処理部に固有のIDとしては、例えば自サービス処理部が動作しているサービス処理サーバ12のネットワークID等を適用することができる。また、ステップ102では自サービス処理部を実現するサービス処理プログラムを実行しているプロセスに割当てられているIDをプロセス毎IDとして取得する。またステップ104では、リクエスト毎IDとして、サービスIDを生成する毎に異なるIDを決定する。なお、リクエスト毎IDとしては、例えば単純な通番、或いはID決定時の時刻等を適用することができる。そしてステップ106では、各IDを組み合わせたID要素として、例として図16(A)に示すように、リクエスタ固有ID、プロセス毎ID及びリクエスト毎IDを直列に並べたID要素を生成する。
次のステップ108では、自サービス処理部が、より上位のサービス処理部が存在しない最上位のサービス処理部か否か判定する。判定が肯定された場合はステップ110へ移行し、新たなリクエスト毎ID(先のステップ214で決定したリクエスト毎IDとは異なるID)を決定する。次のステップ112では、ステップ110で決定した新たなリクエスト毎IDを、先のステップ100で取得したリクエスタ固有ID、先のステップ102で取得したプロセス毎IDと組み合わせ、新たなID要素(第2のID要素)を生成する。図16(A)に示すように、本実施形態に係るサービスIDは、オリジナルサービスID(OSID)、呼出元サービスID(SSID)及び呼出先サービスID(NSID)から構成されており、次のステップ114では、先のステップ106で生成したID要素をオリジナルサービスID及び呼出元サービスIDに各々設定すると共に、ステップ112で生成した第2のID要素を呼出先サービスIDに設定したサービスIDを生成し(図16(B)に示すサービス処理部Aも参照)、生成したサービスIDを処理実行部26へ通知して処理を終了する。
なお、最上位のサービス処理部に設けられたサービスID生成部30によって生成されるサービスIDは、上記のように、オリジナルサービスID及び呼出元サービスIDに設定するID要素と、呼出先サービスIDに設定するID要素を相違させることに限られるものではなく、オリジナルサービスID、呼出元サービスID及び呼出先サービスIDに全て同一のID要素を設定したサービスIDを生成するようにしてもよい。
一方、自サービス処理部よりも上位のサービス処理部が存在しており、自サービス処理部が最上位のサービス処理部ではない場合は、ステップ108の判定が否定されてステップ116へ移行する。自サービス処理部が最上位のサービス処理部ではない場合は、自サービス処理部が上位のサービス処理部から受信したサービス要求に付加されていたサービスIDが処理実行部26から通知され、ステップ116では、処理実行部26より通知されたサービスIDから、オリジナルサービスIDとして設定されているID要素と、呼出先サービスIDとして設定されているID要素を各々抽出する。そしてステップ118では、通知されたサービスIDにオリジナルサービスIDとして設定されていたID要素をオリジナルサービスIDに設定すると共に、通知されたサービスIDに呼出先サービスIDとして設定されていたID要素を呼出元サービスIDに設定し、更に、先のステップ216で生成したID要素を呼出先サービスIDに設定したサービスIDを生成し(図16(B)に示すサービス処理部B〜Dも参照)、生成したサービスIDを処理実行部26へ通知して処理を終了する。
本実施形態に係るサービス処理システム10では、サービスID生成部30が、下位のサービス処理部が存在しているサービス処理部に各々設けられており、個々のサービスID生成部30でサービスIDの生成が各々行われるが、上記のように、ID要素にリクエスタ固有IDを含めることで、個々のサービス処理部のサービスID生成部30で生成されるID要素は、少なくとも個々のサービス処理部を単位とする一意性が確保される。また、ID要素にプロセス毎IDを含めることで、個々のサービス処理部のサービスID生成部30で生成されるID要素は、個々のサービス処理部内での一意性も確保される。従って、個々のサービス処理部のサービスID生成部30で生成されるID要素は、サービス処理システム10内における一意性が確保されている(他のID要素と重複していないことが保証されている)ので、一意性が確保されたID要素(サービスID)を生成するために排他制御を伴う採番処理を行う必要はなく、排他制御を伴う採番処理を行うことでサービス処理システム10の性能が著しく低下することを回避できる。
なお、ID要素にはプロセスIDも含まれているので、同一のサービス処理部として機能するプロセスが単一のサービス処理サーバ12内に複数存在している場合にも、サービス要求に付加されたサービスIDのうちのプロセスIDを参照することで、対応するサービス要求が複数のサービス処理部のうちの何れのサービス処理部で処理されたのかを判断することも可能となる。
また、上記のサービスID生成部処理を行うことで、最上位のサービス処理部を起点として下位のサービス処理部へ受け渡されるサービスIDは、例として図16(B)に示すように遷移し、オリジナルサービスIDは一定で、上位のサービス処理部が存在する或るサービス処理部から出力される(サービス要求に付加される)サービスIDのうちの呼出元サービスIDには、上位のサービス処理部から受け取ったサービスIDにおける呼出先サービスIDと同一のID要素が設定され、前記或るサービス処理部から出力されるサービスIDのうちの呼出元サービスIDには、前記或るサービス処理部を識別可能なID要素が設定されることになる。これにより、サービス処理システム10内で障害が発生し、特定のサービス処理部に処理未了のサービス要求が滞留した場合にも、滞留しているサービス要求に付加されたサービスIDに呼出元サービスIDとして設定されているID要素から、滞留しているサービス要求を送信したサービス処理部を識別することができ、この識別処理を、対応するサービスID(呼出元サービスIDが呼出先サービスIDと同一のサービスID)を辿りながら繰り返すことで、滞留している処理未了のサービス要求の処理履歴を把握することが可能となる。
また、サービスIDが呼出元サービスID及び呼出先サービスIDのみから構成されていた場合、例えば図17に示すように、サービス要求がサービス処理部Aからサービス処理部B,Cを経由してサービス処理部D,Eに伝わった後で、サービス処理部B,Cに障害が発生し、サービス処理部B,Cに記録されていた情報が消失したときに、サービス処理部D,Eに呼出元サービスID及び呼出先サービスIDのみから成るサービスIDが記録されていたとすると、当該サービスIDの呼出元ID及び呼出先IDに設定されているID要素に基づいて同一のサービス要求を辿っていくことは不可能である。これに対し、サービスIDにオリジナルサービスIDも加えておくことで、障害発生時もオリジナルIDを参照し、オリジナルサービスIDが同一のサービスIDと対応付けられた情報を同一のサービス要求に対応する情報とみなすことができ、例えばバッチ処理等により、オリジナルサービスIDをキーにして同一のサービス要求に対応する情報を検索・抽出し、データの矛盾を解消して整合性をとるための処理を行うことが可能となる。
また、下位のサービス処理部が存在するサービス処理部には、サービス呼出部32が下位のサービス処理部と同数個設けられており、サービス呼出部32は、処理実行部26から下位サービスのサービスIDが通知されて下位サービスの実行が要求される毎に、図12に示すサービス呼出部処理を行う。このサービス呼出部処理では、まずステップ130において、下位のサービス処理部に対して下位サービスの実行を要求するサービス要求の電文を作成する。なお、この電文には処理実行部26から通知された下位サービスのサービスIDが付加される。次のステップ132では、ステップ130で作成したサービス要求の電文を対応する下位のサービス処理部へ送信する。またステップ134では、対応する下位のサービス処理部へサービス要求の電文を送信したことを表すステータス情報を、送信した電文と共に管理部24の処理状況テーブル38に記憶させる。
ステップ132で送信したサービス要求の電文に対し、対応する下位のサービス処理部から応答電文が送信されると、次のステップ136で下位のサービス処理部から送信された応答電文を受信する。またステップ138では、下位のサービス処理部からサービス要求に対する応答電文を受信したことを表すステータス情報を、受信した応答電文と共に管理部24の処理状況テーブル38に記憶させる。受信した応答電文には下位サービスのサービスIDと下位サービスの処理結果を表す情報が含まれており、上記処理によりこれらの情報も処理状況テーブル38に記憶されることになる。そしてステップ140では、下位のサービス処理部からサービス要求に対する応答電文を受信したことを、受信した応答電文に設定されている下位サービスのサービスID及び下位サービスの処理結果と共に処理実行部26へ通知し、サービス呼出部処理を終了する。
また、上位のサービス処理部が存在するサービス処理部には処理結果確認部34が設けられており、この処理結果確認部34は、上位のサービス処理部から処理結果確認要求の電文を受信する際に図13に示す処理結果確認部処理を行う。この処理結果確認部処理では、まずステップ150で上位のサービス処理部から処理結果確認要求の電文を受信し、次のステップ152において、上位のサービス処理部から処理結果確認要求の電文を受信したことを表すステータス情報を、受信した電文と共に管理部24の処理状況テーブル38に記憶させる。次のステップ154では受信した電文の内容をチェックし、受信した電文の内容を適正か否か判定する。判定が否定された場合はステップ156へ移行し、上位のサービス処理部へ送信する応答電文にエラーメッセージを設定し、ステップ160へ移行する。
一方、受信した電文の内容が適正であった場合は、ステップ154の判定が肯定されてステップ158へ移行し、受信した処理結果確認要求の電文に付加されている処理結果確認対象のサービスのサービスIDを抽出し、抽出したサービスIDを管理部24に通知して対応するサービスの処理結果を管理部24に問い合わせる。これにより、管理部24では管理部処理(後述)が行われる。管理部24による管理部処理が終了し、問い合わせた処理結果が通知されると、通知された処理結果を上位のサービス処理部へ送信する応答電文に設定した後にステップ160へ移行する。ステップ160では、ステップ156又はステップ158で生成した応答電文を上位のサービス処理部へ送信する。またステップ162では、上位のサービス処理部へ応答電文を送信したことを表すステータス情報を、送信した応答電文と共に管理部24の処理状況テーブル38に記憶させ、処理結果確認部処理を終了する。
また、管理部24では、処理結果確認部34や処理実行部26からサービスIDが通知され、通知されたサービスIDのサービスの処理結果の問い合わせがある毎に、図14に示す管理部処理を行う。
この管理部処理では、まずステップ170において、処理結果確認部34又は処理実行部26から通知されたサービスIDをキーにして処理状況テーブル38を検索し、通知されたサービスIDと対応付けて処理状況テーブル38に登録されている処理結果情報(対応する自サービスや下位サービスの処理結果を各々表す情報)を抽出する。次のステップ172では抽出した処理結果情報を参照し、通知されたサービスIDに対応するサービスの中に、処理結果が「不明」の下位サービスが存在しているか否か判定する。処理結果確認対象のサービス(通知されたサービスIDのサービス)に対応する下位サービスが存在しない場合や、対応する下位サービスが存在しているものの、当該下位サービスの処理結果が「処理済」等の場合は判定が否定されてステップ176へ移行し、ステップ170で抽出した処理結果情報が表す処理結果を問い合わせ元の処理結果確認部34又は処理実行部26に通知し、処理を終了する。なお、通知されたサービスIDが処理状況テーブル38に未登録の場合は未登録であることを表す情報を問い合わせ元へ通知する。
また、処理結果確認対象のサービスに対応する下位サービスが存在しており、かつ当該下位サービスの処理結果が「不明」の場合は、ステップ172の判定が肯定されてステップ174へ移行し、処理結果が「不明」の下位サービスに対応する結果確認呼出部36に対し、処理結果が「不明」の下位サービスのサービスIDを通知し、対応する下位サービスの処理結果の確認を要求する。これにより、結果確認呼出部36では結果確認呼出部処理(後述)が行われる。また、結果確認呼出部36における結果確認呼出部処理が完了し、結果確認呼出部36によって確認された下位サービスの処理結果が通知されるとステップ172に戻る。これにより、処理結果確認対象のサービスに対応するサービスの中に処理結果が「不明」の下位サービスが複数存在している場合はステップ174が繰り返され、該当する全ての下位サービスの処理結果の確認が対応する結果確認呼出部36で各々行われる。そしてステップ172の判定が否定されるとステップ176へ移行し、結果確認呼出部36から通知された下位サービスの処理結果を含め、 処理結果確認対象のサービスの処理結果を問い合わせ元の処理結果確認部34又は処理実行部26に通知し、処理を終了する。
また、下位のサービス処理部が存在するサービス処理部には、結果確認呼出部36が下位のサービス処理部と同数個設けられており、結果確認呼出部36は、管理部24から下位サービスのサービスIDが通知されて下位サービスの処理結果の確認が要求される毎に、図15に示す結果確認呼出部処理を行う。この結果確認呼出部処理では、まずステップ180において、下位のサービス処理部に対して下位サービスの処理結果の通知を要求する処理結果確認要求の電文を作成する。なお、この電文には管理部24から通知された下位サービスのサービスIDが付加される。次のステップ182では、ステップ180で作成した処理結果確認要求の電文を対応する下位のサービス処理部へ送信する。またステップ184では、対応する下位のサービス処理部へ処理結果確認要求の電文を送信したことを表すステータス情報を、送信した電文と共に管理部24の処理状況テーブル38に記憶させる。
ステップ182で送信した処理結果確認要求の電文に対し、対応する下位のサービス処理部から応答電文が送信されると、次のステップ186で下位のサービス処理部から送信された応答電文を受信する。またステップ188では、下位のサービス処理部から処理結果確認要求に対する応答電文を受信したことを表すステータス情報を、受信した応答電文と共に管理部24の処理状況テーブル38に記憶させる。受信した応答電文には下位サービスのサービスIDと下位サービスの処理結果を表す情報が含まれており、上記処理によりこれらの情報も処理状況テーブル38に記憶されることになる。そしてステップ190では、下位のサービス処理部から処理結果確認要求に対する応答電文を受信したことを、受信した応答電文に設定されている下位サービスのサービスID及び下位サービスの処理結果と共に管理部24へ通知し、処理結果確認呼出部処理を終了する。
なお、上記では、サービス処理部の機能を便宜的に各機能ブロック毎に分けて説明したが、個々のサービス処理サーバ12をサービス処理部として機能させるサービス処理プログラムは、各機能ブロック毎に分けられていてもよいし、一体化されていてもよい。
また、個々のサービス処理部をリファレンスモデルに準拠して構築することで、個々のサービス処理部における処理はその大部分が定型処理になり、サービス処理部を実現するプログラムのうち、サービス受付部28やサービスID生成部30、サービス呼出部32、処理結果確認部34、結果確認呼出部36を実現するプログラム、及び、処理実行部26を実現するプログラムのうちの処理実行部APIは部品化することが可能である。これにより、プログラム開発者は、部品化したプログラムを流用してサービス処理プログラムを開発することができ、個々のサービス処理部毎に異なる特有処理を実現するプログラム(例えば処理実行部26の業務プログラム)の開発に専念できるので、プログラム開発者の負担の大幅な軽減、プログラム開発に要する期間の大幅な短縮を実現することができる。
また、サービス処理システム10における各サービス処理部のうち、BPEL44ではサービス処理プログラムがBPELのプラットフォーム上で動作するので、BPELが提供する機能を利用することで、仮想冪等機能を実現する処理実行部26のプログラムをより容易に開発することが可能となる。すなわち、BPELのプラットフォームは、或るプログラムが呼び出される毎に、呼び出されたプログラムを実行するプロセス(インスタンスともいう)を生成し、メモリ12B等の記憶手段の記憶領域のうち生成したプロセスに対応する所定領域(BO(Business Objects)という)に、呼出時の引数を設定すると共に、生成したプロセスにおける処理の進行状態を表す状態情報も設定し、対応するプロセスにおける処理の進行状態の変化に応じて状態情報を適宜更新する、という機能を提供している。
このため、上記機能を利用し、例として図18に示すように、サービス処理部のプログラムのうち、少なくとも処理実行部26として機能するプログラム(当該プログラムにはサービス受付部28として機能するプログラムやサービス呼出部32として機能するプログラムも含まれていてもよい)を、サービスID及び冪等フラグを引数として呼び出され、起動されると、自プロセスと同一のサービスIDを引数として生成された他プロセスが存在しているか否かを確認する(図18の「処理結果確認」も参照)ように構成すれば、今回の呼び出しに対応するサービス要求が、過去に受けたサービス要求の再送であるか否かを簡単に確認することができる。また、上記プログラムを、自プロセスと同一のサービスIDを引数として生成された他プロセスが存在している場合に、該当する他プロセス(該当する他プロセスが複数存在している場合は、そのうちの最新の(最後に生成された)他プロセス)のBOから状態情報をコピーする(図18の「BOコピー」も参照)ように構成することで、今回の呼び出しに対応するサービス要求を前回受けた際の処理の状態を継承し、前回の処理の続きから開始することを簡易な処理で実現することができる。また、上記プログラムを、実行が要求されたサービスに対応する非冪等の下位サービスが存在する場合に、当該下位サービスの処理結果を確認し、「処理済」であれば下位サービスの実行要求をスキップする(図18の「実行済?」も参照)ように構成することで、仮想冪等機能を簡易な処理によって実現することができる。このように、BPELのプラットフォームの特徴を利用することで、サービス処理プログラムの開発負荷を更に削減することが可能となる。
また、本実施形態に係るサービス処理システム10では、個々のサービス処理部がサービス要求や処理結果確認要求の受信時に、図3や図4に示す処理シーケンスで処理を行うことで、最上位のサービス処理部が送信したサービス要求や処理結果確認要求が複数段のサービス処理部に亘って連鎖することになる。以下、最上位のサービス処理部からサービス要求や処理結果確認要求が送信された場合の、サービス処理システム10全体としての処理シーケンスを説明する。なお以下では、対象サービスが、プロバイダ46、パッケージ・ラッパー48及びMBラッパー50の各々による下位サービスの実行を必要とするサービスであるものとする。
最上位のサービス処理部(リクエスタ42)に対してサービスの実行が指示された場合のシーケンスの一例を図19に示す。このシーケンスでは、リクエスタ42に対してサービスの実行が指示されると、リクエスタ42のサービスID生成部30によって下位サービスのサービスID(BPEL44へ送信するサービスID)が生成され(図19のステップ260も参照)、リクエスタ42のサービス呼出部32によってBPEL44へサービス要求が送信される。
サービス要求を受信したBPEL44の処理実行部26は、実行が要求されたサービスに対応する自サービスが存在している場合には自サービスの処理を行い(図19のステップ262も参照)、サービスID生成部30によって下位サービス1のサービスID(プロバイダ46へ送信するサービスID)を生成させ(図19のステップ264も参照)、プロバイダ46に対応するサービス呼出部32を呼び出し、プロバイダ46に対応するサービス呼出部32によってプロバイダ46へサービス要求を送信させる。サービス要求を受信したプロバイダ46では、要求された下位サービス1の処理が処理実行部26によって行われ(図19のステップ266も参照)、処理終了後にサービス受付部28によってBPEL44へ応答が送信される。
BPEL44の処理実行部26は、プロバイダ46からの応答が受信され、処理結果が「処理済」であった場合、サービスID生成部30によって下位サービス2のサービスID(パッケージ・ラッパー48へ送信するサービスID)を生成させ(図19のステップ268も参照)、パッケージ・ラッパー48に対応するサービス呼出部32を呼び出し、パッケージ・ラッパー48に対応するサービス呼出部32によってパッケージ・ラッパー48へサービス要求を送信させる。サービス要求を受信したパッケージ・ラッパー48では、要求された下位サービス2の処理がパッケージ・システム66と協働することで行われ(図19のステップ270も参照)、処理終了後にサービス受付部28によってBPEL44へ応答が送信される。
BPEL44の処理実行部26は、パッケージ・ラッパー48からの応答が受信され、処理結果が「処理済」であった場合、サービスID生成部30によって下位サービス3のサービスID(MBラッパー50へ送信するサービスID)を生成させ(図19のステップ272も参照)、MBラッパー50に対応するサービス呼出部32を呼び出し、MBラッパー50に対応するサービス呼出部32によってMBラッパー50へサービス要求を送信させる。サービス要求を受信したMBラッパー50では、要求された下位サービス3の処理が預為システム68と協働することで行われ(図19のステップ274も参照)、処理終了後にサービス受付部28によってBPEL44へ応答が送信される。
BPEL44では、パッケージ・ラッパー48からの応答が受信され、処理結果が「処理済」であった場合、処理実行部26からサービス受付部28へ処理結果が通知され、サービス受付部28はリクエスタ42へ応答を送信して処理結果を通知する。これにより、リクエスタ42では実行が指示されたサービスの処理結果(「処理済」)を出力する処理が行われる(図19のステップ276も参照)。このように、最上位のリクエスタ42からBPEL44を経由してプロバイダ46やパッケージ・ラッパー48、MBラッパー50へサービス要求が連鎖していくことで、指示されたサービスが実行される。
次に、サービス処理システム10に障害が発生した場合のシーケンスを説明する。図20に示すシーケンスは、BPEL44がパッケージ・ラッパー48へサービス要求を送信した直後に障害が発生し、送信したサービス要求がパッケージ・ラッパー48で受信されなかったことで、パッケージ・ラッパー48から応答が送信されず、タイマがタイムアウトした場合のシーケンスである。図20に示すシーケンスでは、BPEL44からパッケージ・ラッパー48へのサービス要求の再送信の図示を省略しているが、パッケージ・ラッパー48へサービス要求を所定回再送信してもパッケージ・ラッパー48からの応答が受信されなかった場合、BPEL44の処理実行部26の業務プログラムから処理実行部APIへ制御が戻る。
ここで、処理実行部APIは、実行が要求されたサービスの処理結果が「不明(タイムアウト/リトライ回数超過)」であることをサービス受付部28経由でリクエスタ42へ通知するようにしてもよいが、図20に示すシーケンスではパッケージ・ラッパー48による下位サービス2の処理結果を管理部24に問い合わせ、この場合、下位サービス2の処理結果が「不明」であることから、パッケージ・ラッパー48に対応する結果確認呼出部36によってBPEL44からパッケージ・ラッパー48へ処理結果確認要求が送信される。 この間にサービス処理システム10の障害が解消していた場合、この処理結果確認要求がパッケージ・ラッパー48で受信され、パッケージ・ラッパー48の処理結果確認部34によって通知されたサービスIDに対応する下位サービス2の処理結果が確認される。この場合は処理結果が「処理未済」であるので、処理結果が「処理未済」であることを通知する処理結果通知がパッケージ・ラッパー48からBPEL44へ送信される。
パッケージ・ラッパー48からの処理結果通知を受信し、処理結果が「処理未済」であることを確認すると、BPEL44の処理実行部26はパッケージ・ラッパー48に対応するサービス呼出部32を呼び出し、サービス呼出部32によってBPEL44からパッケージ・ラッパー48へサービス要求が再度送信される。これにより、パッケージ・ラッパー48では、要求された下位サービス2の処理がパッケージ・システム66と協働することで行われる(図20のステップ270も参照)。以降のシーケンスは図19と同一であるので説明を省略する。
また、図21に示すシーケンスは、MBラッパー50がBPEL44から受信したサービス要求で要求された下位サービス3の処理を預為システム68と協働して行った結果、業務エラーが発生した場合(図21のステップ275も参照)のシーケンスである。この場合、処理結果が「業務エラー」であることを通知する応答がMBラッパー50からBPEL44へ送信される。この応答がBPEL44で受信されると、BPEL44の処理実行部26は、プロバイダ46による下位サービス1及びパッケージ・ラッパー48による下位サービス2が「処理済」で、MBラッパー50による下位サービス3が「業務エラー」となったことによるデータの不整合を解消するため、まず対応する下位サービス2のサービスIDを認識し(図21のステップ282も参照)、パッケージ・ラッパー48が先に実行した下位サービス2の処理を取り消す処理の実行を要求するサービス要求(図21では「取消要求」と表記)を、サービス呼出部32によってパッケージ・ラッパー48へ送信させる。これにより、パッケージ・ラッパー48は、実行が正常に終了している下位サービス2の処理をパッケージ・システム66と協働して取り消す取消処理を行う(図21のステップ284も参照)。
また、上記のサービス要求(取消要求)に対する応答をパッケージ・ラッパー48から受信すると、BPEL44の処理実行部26は、対応する下位サービス3のサービスIDを認識し(図21のステップ286も参照)、MBラッパー50が先に実行した下位サービス3の処理を取り消す処理の実行を要求するサービス要求(図21では「取消要求」と表記)を、サービス呼出部32によってMBラッパー50へ送信させる。これにより、MBラッパー50は、実行が正常に終了している下位サービス2の処理を預為システム68と協働して取り消す取消処理を行う(図21のステップ288も参照)。
上記のサービス要求(取消要求)に対する応答をMBラッパー50から受信すると、BPEL44の処理実行部26はサービス受付部28へ処理結果を通知し、サービス受付部28はリクエスタ42へ応答を送信して処理結果を通知する。これにより、リクエスタ42では実行が指示されたサービスの処理結果(実行が指示されたサービスは途中で業務エラーが発生したことで取り消された旨を表す「取消済」)を出力する処理が行われる(図19のステップ276も参照)。
また、図22に示すシーケンスは、BPEL44がMBラッパー50へサービス要求を送信した直後に障害が発生し、送信したサービス要求がMBラッパー50で受信されなかったことで、MBラッパー50から応答が送信されず、これに伴いリクエスタ42からBPEL44へサービス要求が再送信された場合のシーケンスである。ここで、BPEL44の処理実行部26等が先に説明した図18のように構成されているとすると、リクエスタ42からのサービス要求の受信に伴い、BPEL44の処理実行部26では、自プロセスと同一のサービスIDを引数として生成された他プロセスが存在しているか否かを確認する処理が行われ(図22のステップ290も参照)、該当するプロセスが存在していることで、今回のサービス要求が過去に受信したサービス要求の再送であることが認識される。
次に、該当するプロセスのBOに記憶されている状態情報が自プロセスのBOにコピーされる(図22のステップ292も参照)。そして、再送されたサービス要求によって要求されたサービスを実行する処理が処理実行部26によって行われるが、本実施形態では、プロバイダ46によって提供されるサービスと、MBラッパー50(及び預為システム68)によって提供されるサービスは冪等性を有している一方、パッケージ・ラッパー48(及びパッケージ・システム66)によって提供されるサービスは冪等性を有していないので、BPEL44からは、プロバイダ46及びMBラッパー50に対してのみサービス要求が送信され、パッケージ・ラッパー48については、対応する下位サービスの処理結果が「処理済」となっていることに基づき、サービス要求の送信がスキップされる。これにより仮想冪等機能が実現される。
図23には、リクエスタ42に対して処理結果の確認が指示された場合のシーケンスの一例を示す。このシーケンスでは、処理結果の確認が指示されると、リクエスタ42の管理部24によって確認対象のサービスの処理結果が確認され、処理結果が「不明」であれば確認対象のサービスのサービスIDが認識(図23のステップ296も参照)された後に、リクエスタ42の結果確認呼出部36によってBPEL44へ処理結果確認要求が送信される。リクエスタ42から処理結果確認要求を受信したBPEL44では、処理結果確認部34からの要求に従い、管理部24によって対応する自サービスの処理結果が確認される(図23のステップ298も参照)と共に、対応する下位サービスの処理結果も確認される(図23のステップ298も参照)。
ここで、対応する下位サービスの中に処理結果が「不明」の下位サービスが存在していた場合(ここでは、MBラッパー50が提供する下位サービスの処理結果が「不明」であったものとする)、処理結果が「不明」の下位サービスに対応する結果確認呼出部36が管理部24によって呼び出され、結果確認呼出部36は対応する下位のサービス処理部(この例ではMBラッパー50)へ処理結果確認要求を送信する。また、BPEL44が下位のサービス処理部から処理結果通知を受信すると、BPEL44の処理結果確認部34によってリクエスタ42へ処理結果通知が送信される。これにより、リクエスタ42では処理結果の確認が指示されたサービスの処理結果を出力する処理が行われる(図23のステップ276も参照)。このように、処理結果の確認が指示された場合も、リクエスタ42からBPEL44へ処理結果確認要求が送信され、必要に応じてより下位のサービス処理部へ処理結果確認要求が連鎖していくことで、指示されたサービスの処理結果が確認される。
なお、上記では本発明に係るサービス処理システムとして、5個のサービス処理部が3層(3段)に分けられ、3層目(3段目)の3個のサービス処理部が2層目(2段目)の単一のサービス処理部に各々連結され、2層目(2段目)の単一のサービス処理部が1層目(1段目)の単一のサービス処理部に連結された構成のサービス処理システム10を例に説明したが、サービス処理部の総数や段数、各段(各層)におけるサービス処理部の数は上記に限られるものではなく、例えばサービス処理部がより多数段連結された構成のサービス処理システムにも本発明を適用可能であることは言うまでもない。
また、上記では2段目(2層目)のサービス処理部を実現するためのサービス処理プログラムが、BPELのプラットフォーム上で動作する態様を説明したが、これに限定されるものではなく、本発明に係るサービス処理システムはBPELを利用せずに構築することも可能である。
また、上記では個々のサービス処理部が互いに異なるコンピュータ(サービス処理サーバ12)によって実現される態様を説明したが、これに限定されるものではなく、本発明は単一のコンピュータを互いに異なる複数種のサービス処理部として各々機能させる態様にも適用可能である。
また、上記では本発明に係るプログラムに対応するサービス処理プログラムがサービス処理サーバ12の記憶部12Cに予め記憶(インストール)されている態様を説明したが、本発明に係るプログラムは、CD−ROMやDVD−ROM等の記録媒体に記録されている形態で提供することも可能である。この態様における記録媒体は本発明に係る記録媒体に対応している。