(57)【特許請求の範囲】
【請求項１】
キューの状態と、メッセージキューデータと、ログレコードを含んで連結されたメッセージキューを有するトランザクションメッセージを伝送する手段と、
受容サイトで、上記メッセージキューデータと上記ログレコードとが組み合わされたオンディスクファイル構造を用いている単一ディスクの単一ファイルに上記トランザクションメッセージキューデータを格納する手段と
を含み、
前記単一ファイルは、ファイル中に一定間隔で分散配置され、前記キューの状態と前記ログレコードについての制御情報を格納する複数の制御ブロックと、制御ブロックと制御ブロックとの間に複数配置され、前記メッセージキューデータを格納する複数の隣接するデータブロックと、複数の隣接するデータブロックと複数の隣接するデータブロックとの間に配置され、隣接する下流ブロックでのメッセージへの状態変化を示す前記ログレコードを格納するログレコードブロックとを有するメッセージキューイングシステム。
【請求項２】
上記単一ディスクにアクセスする読出し／書込みヘッドと、書込み動作中に上記ヘッドを単一フォワード方向で駆動する手段とをさらに含むことを特徴とする請求項１に記載のメッセージキューイングシステム。
【請求項３】
上記ディスクの予め選択された場所に配置されて、制御情報ブロックと、少なくとも１つのメッセージブロックと、少なくとも１つのログレコードとを有するキューエントリマネジメントテーブルをさらに含む請求項１記載のメッセージキューイングシステム。
【請求項４】
上記予め選択された場所が上記ファイルの開始から固定されたオフセットと対応し、これによってメッセージキューデータの最新状況を迅速に識別することができる請求項３記載のメッセージキューイングシステム。
【請求項５】
上記受容サイトで、上記情報の前の最新キューエントリマネジメントテーブルに呼応する上記伝送の割込み時に、上記メッセージキューを回復する手段をさらに含み、これによって、上記最新キューエントリマネジメントテーブルに含まれる情報から受信され格納された最新有効情報を見つける請求項４記載のメッセージキューイングシステム。
【請求項６】
上記ファイルが複数のセクタに分割され、上記テーブルが有効情報を有するセクタの位置に対するチェックポイントを構成するように上記オフセットがキューエントリマネジメントテーブルをセクタの最初に配置し、これによって上記割込み前の最新の有効情報が、上記最新のテーブルを包むセクタの識別を通して迅速に見つけ出される請求項５記載のメッセージキューイングシステム。
【請求項７】
上記マネジメントキューテーブルが隣接ブロックに書込まれ、単一ファイルの結果、フォワード書込み方向および隣接メッセージキューデータブロックシステムによりシーク時間を最小限に抑え、伝送割込みから完全かつ迅速な回復を増大させる請求項２記載のメッセージキューイングシステム。
【発明の詳細な説明】
技術分野
この発明は、メッセージキューイングに関し、より詳しくはクライアントサーバおよびモバイルエージェントアプリケーションのための迅速で信頼性のあるトランザクションメッセージキューイングシステムに関し、さらに、当該システムのためのログベースデータアーキテクチャに関する。
背景技術
メッセージキューイングは、その本来の同期処理および非同期処理をいずれも可能にするという柔軟性により、それぞれ異なるコンピュータシステム上のアプリケーション間で最も基本となる通信範例である。メッセージキューイングミドルウェア基幹は、一般的なクライアントサーバならびにモバイルエージェント計算処理、すなわちワークフロー計算処理、オブジェクトメッセージ伝送、トランザクションメッセージ伝送およびデータ複写サービスのいずれにおいても膨大なアプリケーションドメインについて非常に柔軟性のある骨組みである。
トランザクションメッセージ伝送の場面ではデータが転送中に紛失することがたびたびある。金融業界では、ある場所から別の場所に転送される銀行の取引記録が、サーバ不良、送信回線の不具合またはその他人為的なものによって紛失する可能性があるが、これが金融業界で起これば大惨事になる。エラーが発生したことを迅速に突き止めることができ、かつデータが有効であった既知のポイントからデータの再構築を可能にすることがシステムマネージャに課せられる。
クラッシュ前の当該システムの最新状況を再構築するために当該システムがいわゆるログファイル全体を走査することによって、過去においてエラーが発生した地点を確定する。関連するタイムスタンプを有するログファイルを常時利用して、メッセージおよびログファイルに含まれるデータを識別する。しかしながら、最新状況を確認するためにログファイル全体を走査するには、１，０００ものログレコードを走査する必要がある。
エラーの発生した地点を突き止め、かつその発生地点からファイルを再構築するログレコード全体をそうさすることは、非能率な方法というだけでなく、従来のシステムでは、２種類のディスクファイルが必要であった。このうち、ひとつはデータファイルとして、他方はログファイルとして機能する。
さらに、ログエントリとデータファイルまたはセクタの間の相互関係は、従来のセクタが識別性のない順序で格納され、ログファイルとセクタとの間のマッピングが所要時間の多少かかるプロセスであるたため複雑である。
さらに技術背景では、一つのポイントから別のポイントに伝送されるデータレコードが損なわれることのないような格納装置を提供可能にするようなメッセージキューイングが一般的に使用されることは理解されよう。たとえば、ある場所でエラーが発生しデータが紛失した場合でも、メッセージキューイング本来の格納装置が機能してデータを第２の場所で再構築可能である。
例として、特に株取引では、取引中の割込みは数時間というよりは数分に極限されることが望ましい。しかし、時に、システムサーバが停止した場合、その時のシステムでの取引数により、回復に２時間から８時間もかかることがある。したがって、停止時間や破損ファイルの見つけ出しと再構築に所要する時間と費用を最小限に抑える必要がある。
なお、ここで用いられるキューファイルは、伝送中のメッセージの物理的格納装置を表す。キューファイルは、未完了操作のための保持用セルと称することもできる。すなわち、基本的には、所定のメッセージを受信する受け手がそこにいない場合、メッセージをキューファイルに保持し、後で送出できるようにすることを意味する。したがって、キューファイルは送信された情報の保持に信頼性を与える。
さらに、従来のシステムにおいて、回復データは、キューファイルそれ自体により提供されるものではない。したがって、エラーまたはデータの紛失が発生した場合、キューファイルはファイル状態を確認するために利用されていない。すなわち、以前に不正処理されていないデータからデータファイルを再構築するためにキューファイルは使用されていない。従来のシステムでは、キューファイルそれ自体により回復データが提供されることはない。
メッセージキューイングの実世界のアプリケーションへの応用例についての別の例では、メッセージキューイング基幹のモバイルエージェントを用いたリアルタイムオンライントランザクション処理の支援の仕方に絡んでいる。本例では、顧客はたとえば地理的に分散した支店を有する銀行である。顧客の口座が作られ、その口座が開設された地方支店で保管される。例示の目的のために、これを口座の本拠地支店（home branch）と称する。各口座の写しが本店においても保管される。口座の読出し取り操作を地方支店または本店のいずれからも行うことが可能である。しかしながら、本拠地支店にある写しと本店の写しとが同等に更新することが要求される。
更新の要求が本拠地支店で発生すると、地方支店にあるコピーを更新しなければならない。この更新によって、次にキューに加える（enqueue）要求をキューマネージャまたはキューサーバに自動的に送出するエージェントを始動することが可能である。このキューマネージャは、広域ネットワークを介して別のキューマネージャに対しての要求をキューから外し（dequeue）、このキューマネージャが、今度は、ミラーオフィスにある口座のデータベースサーバに対しての更新要求をキューから外す。
メッセージキューは、本例では非同期の信頼性のある処理を提供する。非同期処理は、ある位置でのデータベースの更新によって起動するエージェントから始まる。エージェントは、更新要求をメッセージキューマネージャに対して非同期で送出するが、応答を待つ必要はない。メッセージキューマネージャは、要求者が応答を待つ必要なく処理を継続できるように要求についての保持セルとして機能する。さらにメッセージキューマネージャは、本例では、更新の要求の受け手が、トランザクションメッセージキューとして当該業界において知られている二相コミットプロトコル（Two Phase Commit Protocol）と呼ばれる周知のハンドシェークプロトコルを介して受信状況をひとつひとつ確認するまで、更新要求のコピーをキューで保持することで信頼性を提供する。
これらフタイプのメッセージキューイングシステムは、これまで信頼可能に動作したが、メッセージキューに添付されるメッセージを格納するために別個のキューデータおよびログレコードファイルを使用するデータ構造に依存するものであった。このような構造は、サーバのクラッシュ時における迅速な修復を妨げ、２種類の格納用ディスクを必要とする。一つはデータのためのディスクであり、他方はログレコードのディスクである。さらに、従来のメッセージキューイング構造は、通常、効率よく作業するための予備のハードウェアを必要とせずには書込み動作が最適化されることはない。また、メッセージ滞留時間の短い高性能のスループットシステムには適切ではない。上述の別個のキューデータおよびログファイルにもまた、非信頼性が必要以上のレベルで取り入れられている。これは、ファイル不正処理および媒体不良の二点が潜在的に含まれているからである。さらに、メッセージキューイングシステムの業務管理担当者のために最初から回復に要する仕事量が予め定められる手段は通常存在しない。
なお、上述のシステムは、Digital Equipment Corporation社のDECmessageQ、IBM社のMQシリーズおよびTransarc社のEncina RQSとして市販化されている。
発明の概要
この発明において提供されるメッセージキューイングシステムは、従来のメッセージキューイングが有する課題を解決するために、メッセージおよびその状況を単一ディスク上の効率的な単一ファイルに保存し格納することによって、サーバ不良からの回復を迅速に行うことが可能となる。メッセージおよびその状況を格納する単一ディスク単一ファイル格納装置システムによって、３種類のそれぞれ異なるディスク、すなわちデータディスク、インデックス構造ディスクおよびログディスクへの書込みが消去される。単一ディスク単一ファイル格納装置は、同一ディスク上の隣接スペースにおいてすべての情報を集束させることによって可能となる。この結果、すべての書込みは、書込みヘッドの一つの掃引動作に含まれ、書込みヘッドは一方向にのみ一度だけ移動して、メッセージの書込み開始を必要とし、その状態を格納する領域を見つけ出す。集束された情報を追従するために使用される固有のキューエントリマップテーブル（Queue Entry Map Table）は、制御情報と、メッセージブロックと、ログレコードと、新規のレコードを書込む際に保存されたデータをトラバースするために書込みヘッドがバックアップする必要が全くない単一ファイルディスク格納装置とを同時に含む。さらに当該システムは、ログファイル全体を走査する必要なく破損ファイルを見つけることができる。
最新の有効データを見つけるために、制御チェックポイント間隔システムを利用して最新の不正処理されていないデータを見つけることができる。走査を行い、最新のチェックポイント間隔を見つけることによって、最後のキューをすぐに認識できる。チェックポイント後にログレコードの走査を行い、すべてのメッセージの最新状況を設定する。上述のシステムによって従前のシステムよりも少ない時間の位数でデータ回復を行うことができる。同時に、効率的なフォワード方向への書込み方法を確立させることによって、順序づけられていないセクタを介して検索する必要がなくなる。
一実施態様によると、最後尾のセクタに新規のレコードを追加することによって先行のセクタを更新し、ファイル状態が変更されたことを示す巡回循環バッファ用システム（circular wrap around buffering system）を用いることによって、開放され、有効メッセージおよび／またはログレコードをもはや保持していない先行のブロックを再利用する。
したがって、この発明は、トランザクションメッセージキューイングシステムのためのログベースデータ構造（アーキテクチャ）を提供するものであり、当該システムは、メッセージキューデータおよびログレコードの組合わせオンディスクファイル構造を利用するものである。この発明の一実施態様によると、単一ディスクのキューデータ／ログレコード組合わせファイルでは、書込み動作の性能および信頼性が向上し、同時に使用ディスク数が減少する。
上述のように、システムクラッシュの回復は、エラーの発生場所を突き止める際にすべてのログレコードを通して検索する必要のないキューエントリマップテーブルを使用することによって加速される。さらに、キューエントリマップテーブルを使用することによって、システム業務管理担当者に対して拡張性および柔軟性をもたらすキューデータファイルに要件の数を当初から割り当てることが可能である。
さらに上述したように、当該システムは、格納装置の再利用のためにキューデータファイルの循環（ラップアラウンド）が潜在的に存在することを暗示する巡回キューを利用するものである。これによって、キューが循環する（ラップアラウンド）場合、まだ有効かもしれないキューデータおよび／またはログレコードが次の書込み動作によって確実に上書きされないように予約表（リザベーションテーブル）または自由空間（フリースペース）ヒープを維持することを要求される。
一実施態様によると、キューデータ格納装置構造（アーキテクチャ）は、キューの固定サイズに基づいてキューマネージャを最初に初期化する場合に作成される単一フラットファイルからなる。初期キューの作成は、メッセージキューイングシステムにおけるピーク負荷、たとえば時に所定の時点でメッセージキューに予想される入力の最大数についてのシステム業務管理担当者の感覚に基づいて行われる。キューデータファイルにおける各メッセージは、メッセージヘッダおよびメッセージ本文を含む。メッセージ本文は、メッセージの内容を含み、メッセージヘッダに続く次の隣接ブロックのディスクに格納される。
上記実施態様では、キューデータファイルは、実行時に拡張可能な所定数の論理セグメントまたはセクタに分割される。各セグメントは、キューエントリマップテーブル（QEMT）のコピーを包含し、各セグメントの冒頭にこれが格納される。QEMTは、キューファイル全体に格納されたキューエントリおよびログレコード情報についての制御情報を包含する。メッセージヘッダ、メッセージ本文およびログレコードは、QEMTの後にメッセージデータおよびログレコードブロックの潜在的な混合と共に格納される。
理解されるように、QEMTのサイズは、ユーザがキュー作成時に定義するキューエントリの予測最大数に依存する。ログレコードは、決定論的バイト数を取るため、キューデータファイルは、ログレコードと、メッセージヘッダと、メッセージ本文と、QEMTの混合のデータタイプから構成される。
新規セグメントがキューデータファイルに到達すると、その新規セグメントの冒頭に新規QEMテーブルがディスクに書込まれ、メッセージおよびログレコードがQEMテーブルに続く。最も小さいオンディスクデータのタイプはログレコードであるため、１ブロックがログレコードのサイズである場合、キューデータファイルのセグメントは、ブロックからなるように定義される。このように実施性を高めることは、検索アルゴリズムの開発を容易にする。
トランザクションメッセージキューイングシステムの状態は、QEMTに包含される制御情報によって捕獲される。QEMTは、各自コピーを維持する各スレッドよりむしろ多重スレッドを作動させることが可能な静的データ構造として定義される。
ログベースデータ構造（アーキテクチャ）の結果、当該発明は、既存のトランザクションメッセージキューイングデータ構造（アーキテクチャ）において多数の改良を提供するものである。書込み動作の性能が既存のメッセージキューイング構造（アーキテクチャ）において改良され、この発明をベースにしたメッセージキューイングシステムによって、高速化の銀行処理アプリケーション等メッセージ滞留時間を短縮した高性能化スループットシステムが確実に達成される。さらに当該システムは、様々な帯域幅を有するネットワークおよび／または信頼性のないネットワークを介してエージェントの搬送の際に根底をなす信頼性のあるメッセージ送信基幹（インフラストラクチャ）についても適用可能である。
さらに、メッセージデータおよびログレコードの書込み動作は、常にフォワード方向に行われ、これらはいずれも同一のディスクファイルに格納されることができる。
また、本システムは、トランザクションメッセージキューイングシステムの信頼性を向上させるものである。当該ログベースデータ構造（アーキテクチャ）において、ファイルの不正処理が分割キューデータおよびログレコードファイルとの２つの潜在的なファイル不正処理の場面に対して起こり得る一つの場所が存在する。また、使用されるディスクファイルが少なくなるため、信頼性も高まる。キューデータ／ログレコードの組合わせファイルは、公知のACID特性の原始性（Atomicity）、一貫性（Consistency）および隔離性（Isolation）のそれぞれの特性に忠実である。さらに、明らかなように、既存のRAID技術を駆使して透過性のある二重書込みを行うことが可能である。
当該システムにおいて、これによって得られたメッセージキューイングシステムによって、先入れ先出し（First In First Out）、後入れ先出し（Last In First Out）または優先順位ベースのメッセージデータアクセスを含むいずれのメッセージデータアクセス方法も支援可能となる。また、同時にシステムクラッシュからの回復に要する時間を短縮することができる。従来のアプローチではログレコードのファイル全体の全データを走査するが、当該システムでは、最新のチェックポイントを決定するために一部のキューエントリマップテーブルをまずテストすることのみ要求される。そして次にそのセグメント内にあるログレコードに走査を進める。
さらに、この発明によって、業務管理担当者は、キューデータファイルのセグメント数、続いてチェックポイント間隔の数を最初から予め定めることによって、システム回復に要する仕事量を調整できるため、当該システムは、メッセージキューイングシステムの業務管理に対して拡張性および柔軟性を提供する。したがって、システム業務管理担当者は、チェックポイントの書込みの合計金額を先に支払うため、回復時に拡張ログレコードの走査を行う場合の高額の支払いを防ぐ。このトレードオフ（交換条件）を調整および微調整することによって、アプリケーションの要件およびドメインを適合させることができる。
上記の利点は、キュー制御情報と、メッセージデータと、メッセージ動作のトランザクションログレコードとを包含する予め割り当てられたオンディスクキューバッファを使用することによる。オンディスクキューバッファは、多数のセグメントまたはセクタから構成される。各セグメントは、同一の所定のブロック数から構成される。各セグメントの冒頭には上述のキューエントリマップテーブルがあり、個別のキューエントリの状況に関する制御情報データと、ディスク上にありメッセージが物理的に格納されるポインタオフセットとを包含する。キューエントリマップテーブルは、メッセージキューイングシステム全体についての固定のチェックポイント間隔として機能する。メッセージ動作のメッセージおよびトランザクションログレコードは、メッセージブロックとログレコードブロックが組み合わせられるようなセグメント内のブロックに格納される。また、ある特定のメッセージのログレコードを当該メッセージに隣接するように格納することは要求されない。
当該発明の特徴として、ディスクヘッドに対して常にフォワード方向になるようにメッセージデータ書込み操作を行う。また、ポインタがトラバースする必要なく連続してメッセージをディスクに格納する。さらに、ログレコード書込み動作は、常にディスクヘッドに対してフォワード方向になるように行う。ログレコードは、二相コミットプロトコルに基づいてメッセージ操作の状態の変化が書込まれる。したがって、ログレコードは、準備（Prepare）、準備完了（Prepared）、コミット（Commit）、アボート（Abort）そして確認（Acknowledge）の各メッセージが遠隔のキューマネージャから書込まれることができる。
別の固有の特徴として、キュー全体がシングルパスで走査されることができる。さらに、オンディスクの不要データの集積は常に線形プロセスである。さらに、多数のキューエントリマップテーブルが、キューマネージャの適切なシャットダウン時にディスクに格納される最新のテーブルの固有のシーケンス番号と共に、同一ファイルに存在している。
重要なこととして、読出し動作は、先出し先入れ、後入れ先出しまたは優先順位ベースの方策に従い、これらの方策のいずれかを実行するために特別な規定を必要としない。
さらに、回復の手順は、キューエントリマップテーブルのタイムスタンプのみを検索することによって加速される。これは、最新のキューエントリマップテーブルが回復プロセスの開始状態として機能するからである。当該テーブルに続くログレコードは順に読み出され、最後の既知のチェックポイント後に行われる変更に反映ために、この最新のキューエントリマップテーブルのインメモリコピーが変更される。
【図面の簡単な説明】
図１は、メッセージが本店からその支店に流れる、当該システムを利用した典型的な銀行取引アプリケーションのブロック図、
図２は、データを一つのファイルに記録し、ログを別のファイルに記録し、前記データを非連続セクタに格納し、最新状況を再構築するためにログファイル全体を走査することを要求しながら、回復プロセスが当該システムの全メッセージの完全な状態を得るためにデータファイルおよびログファイルの両方を含む、２つのファイルシステムを表す線図、
図３は、単一ファイルを利用して、データおよびQEMTマッピングテーブルを格納することにより、ハードウェアを最小にし、データの回復に要する走査時間を短縮して紛失データを迅速に回復可能にする当該システムを表す線図、
図４は、単一書込み方向の巡回ファイルを示した、図３のファイル内にあるデータブロックの格納装置を表す線図、
図５は、QEMT制御ブロックを利用することによって有効データの位置および／または場所を容易に確認できることを示した、ファイル内の各種の周知の位置またはオフセットにおける可能なQEMT制御ブロックを表す線図、
図６は、ファイルをフォワード方向に書き込めるように、メッセージデータブロックによって状態変化のログレコードが分散することを示す線図、
図７は、本QEMT構造を示し、タイムスタンプとして機能し、かつ当該システムを再格納するために必要とされる増分のチェックポイント情報を有した、QEMTシーケンス番号を含む表、
図８は、個別のメッセージ状況を再格納するための情報を提供する表、
図９は、巡回キューを実行する循環システムにおいてフォワード方向へのデータの流れを示す線図、
図１０は、図６のログ入力によって、増分ログレコードに格納された情報を示す表、
図１１は、キューからメッセージを取り出すための手順を示すフローチャート、
図１２は、メッセージをキューに書込むための手順を図示するフローチャート、
図１３は、完全に再格納された状態をもたらす最新のQEMTを識別後にログレコードの次の読出しを行い、最新のQEMTが初期走査によって識別される回復プロセスを示すフローチャートである。
発明を実施するための最良の形態
図１を参照すると、更新された口座情報を支店から本店へ伝送する目的のために、メッセージキューイングシステム１０が銀行の支店１２と本店１４との間に設置される。また、銀行の異なる支店のそれぞれの端末機１６、１８および２０にデータがそれぞれ入力される。このデータは、各支店のローカルデータベースサーバ２２、２４および２６にそれぞれ格納され、各データベースサーバは独自のローカル格納装置を有し、ここでは参照符号２８によって示される。
データベースサーバの出力は、一連のメッセージキューイングサーバ３０、３２および３４にそれぞれ接続され、それぞれが独自の格納装置を保有し、ここでは参照符号３６で付されている。
メッセージキューイングサーバは、広域ネットワーク４０に対してその出力を行う。該ネットワークは、この出力を本店にあるメッセージキューイングサーバ４２に接続し、このサーバは、図示のように、各格納装置４４をそれぞれ有している。メッセージキューイングサーバ３０、３２および３４は、図示のように、接続された格納装置５２を有するデータベースサーバ５０と広域に通信を行う。メッセージキューイングサーバ４２の出力は、図示のように、接続された格納装置５２を備えるデータベースサーバ５０と接続される。このデータベースの情報は、本店の端末機５４において閲覧が可能である。
メッセージキューイングシステムの目的は、更新された口座情報を本店に備えるために支店から信頼して伝送することを可能にすることである。また、本社と直接接続しているかどうかに関係なく、支店におけるトランザクションが進行できることも重要である。
次に、図２を参照すると、従来、６０および６２で図示されるようなメッセージおよびヘッダは、データディスク６４のセクタ６６、６８、７０および７２に格納され、このセクタにおいてメッセージおよび随伴するヘッダがランダムに配置されていた。
同時に、メッセージ状態の情報は、上記データディスクに格納されている各メッセージについてのレコードを含む、ログディスク８０に格納され、着信順位およびデータディスクにおける位置を含んでいた。さらに、トランザクションの状況は、メッセージおよび対応するヘッダそれぞれについてログディスク８０にログインされていた。
「Ｘ」８２で示されるように、伝送が割り込まれる場合、従来、ここでは８４で図示されるように、伝送割込み直前のデータディスクファイルの最新状態が再構築できるようにログファイル全体を走査することが要求されていた。前述したように、これは時間のかかるプロセスであり、クラッシュする直前のシステムの状態を再構築するためには、ログファイル全体が走査されなければならない。メッセージおよびヘッダの情報がデータディスクの非連続セクタに格納されるため、状況ははるかに複雑になる。また、伝送割込み時に不正処理されないメッセージを見つけるためにログファイルとデータファイルとの相互通信が要求される。
次に、図３を参照すると、当該システムにおいてメッセージデータ６０およびメッセージヘッダ情報６２は、単一ディスク格納装置９０の、ここでは９２、９４、９６および９８で図示される連続するセクタに格納される。キューエントリマネジメントテーブルを利用することによってアクセス可能な順番にメッセージおよびヘッダの情報が格納されることはこの発明の特徴であり、後述するチェックポイントシステムを介してメッセージデータを見つける。
メッセージデータがセクタすべてに格納されず、むしろ上述のように連続して格納されることは明らかである。
ファイル９０に格納されたデータにアクセス可能とするために、キューエントリマネジメントテーブル（すなわちQEMT）は、制御情報１００の入力と、メッセージブロック１０２とログレコード１０４とを含むセクタ情報を含む。これらはすべて関連データおよびヘッダが見つけられるセクタを固有に特定するように設計される。したがって、QEMTは、このようにしてシステム状態を特定する。
図４、図５および図６と関連して明らかなように、キューエントリマネジメントテーブルは、メッセージデータとヘッダ情報との間に分散されたファイル９０に格納される。
次に、図４を参照する。一実施態様では、ファイル９０は、隣接するセクタがここでは１０６で図示される情報ブロックを有するように構成され、情報ブロックは、矢印１０８で図示されるように左から入り、左から入るブロック番号１および右から出るブロック番号１３によって図示されるようにファイルを左から右へトラバースする。隣接するブロックおよびファイルを通してのフローは、変化しないいわゆる書込み方向を作成することが理解されよう。
次に、図５を参照する。上述のQEMT制御情報ブロック１００は、QEMT制御情報ブロック１００の位置がファイル９０を通して周知のオフセットでのチェックポイントを特定するように、その他の隣接ブロック１０６間に分散される。
QEMT制御ブロックを一定の間隔で分散する目的は、場合によって、特定のメッセージデータおよびヘッダ情報を含む完全なシステム状態を、チェックポイント番号またはチェックポイント間隔を単に指定することによって迅速に見つけることである。その結果、有効情報を有する最後であるとしてチェックポイント間隔が識別されると、QEMTブロックがどこで有効データが見つけられるか、ならびにその身元および位置を指定した後に隣接ブロックが書き込まれるように、制御QEMT制御ブロックのいずれかの側にメッセージデータおよびログレコードブロックを有することができる。
別の説明として、QEMT制御ブロックは、周知の位置を回復プロセスに提供して当該システムの状態を調査する。
次に、図６を参照すると、ブロック１０６は１１０で図示されるように、メッセージデータブロックとして、または１１２で図示されるように、増分ログブロックとしてブロック１１２を図３中のログレコード１０４に対応させながら利用される。これらのログレコードは、隣接する下流ブロックでのメッセージへの状態変化を記録する。なお、制御ブロックは、ファイルの調査の開始に一部の既知のポイントのみ与え、一方ログレコードはファイルにおける個別のメッセージに関する情報を提供する。
図３に戻って参照すると、ログレコード１０４は、開始点がＱＥＭＴ制御ブロックで表されるデータに関連する多数の連続ログレコードの一つでしかないことが理解されよう。これらのログレコードは、先行のメッセージブロックにおける情報への変更を、その特定のメッセージブロックへの変更についての経過を完全に付するように、記録する。
再び図６に戻ると、所定の数のメッセージブロックは、チェックポイント後に生じた追加メッセージデータブロックを特定するQEMT制御ブロックによって境界が示されることに留意する。このセクタ内にトランザクションログレコード１１２がある。ログレコードＴ１は、メッセージブロックのいずれか一つにおいての変更を記載できることが明らかである。矢印１１４からわかるように、情報は左から右へ流れる。この場合、トランザクションログレコードＴ１は、当該システムにおけるいずれのメッセージについても状態の変化を記述するが、これは、メッセージは受信されてもはや保持する必要がないという確認、またはメッセージは送信されたがまだ受信されていない、または確認されていないという確認の場合もある。さらに、上記は、この種のシステムにおいてメッセージを確実に伝送するために２パスハンドシェーキング技術（two pass handshaking technique）を反映している。
たとえば、トランザクションログレコードＴ１は、新規メッセージがその特定のポイントでファイルに追加されたことを示してもよい。ログレコードの作成時にログレコードの位置が書込みヘッドによって決定されることは理解されよう。そこで、ログレコードが時間Ｔ１で作成される際、書込みヘッドはファイル中のある特定のポイントに存在するが、ログレコードは、全ファイル構造の中のいずれの位置においてもトランザクションおよびメッセージ照会することができる。
同様に、トランザクションログレコードＴ２、Ｔ３およびＴ４は、これらのログレコードを時に連続して投稿しながら、これらのメッセージが状態を変えたことを反映する。
QEMTブロックおよびログレコードブロックは、単一ファイル構造に挿入可能であり、さらに単一ファイル構造は、一実施態様において一方向に情報の流れを有するため、先行技術の２ファイル構造を完全に排除することが可能である。さらに、QEMTブロックおよびトランザクションログレコードブロックを利用することによって、不正処理されないこれらのメッセージを固有に特定して情報割込みの影響を早期診断でき、システム故障後のシステム状態を素早く回復できる。
次に図７を参照すると、キューエントリマネジメントテーブルのヘッダの構成が１２０に図示されている。これによって明らかであるように、一実施態様によると、ヘッダは、キューファイルのセグメント数１２２と、セグメントサイズ１２４と、QEMTシーケンス番号もしくはタイムスタンプ１２６と、前回のセグメントにおける最後尾のログレコードのシーケンス番号１２８と、現行セグメント数１３０と、キューヘッドポインタ１３２と、キューテイルポインタ１３４と、現行のセグメントにおいて次に利用可能なブロック１３６と、QEMT入力の一覧１３８と、ディスクブロックの予約表１４０と、調整者（コーディネータ）として動作する係属中のトランザクション一覧１４２、および受け手として動作する係属中のトランザクション一覧１４４とを含む。
ヘッダに含まれる情報は、回復プロセスの支援情報であることが理解されよう。
次に図８を参照すると、QEMI入力１３８は、それぞれシーケンス番号１４６と、メッセージＩＤ１４８と、QputまたはQgetのいずれかであるメッセージ動作モード１５０と、メッセージ受け手のノード名１５２と、メッセージ受け手のサーバ名１５４と、「アクティブ」、「ペンディング」、「アボート」または「コミット」のいずれかであるトランザクション状況１５６と、受信者によって受信された最後の既知の応答である参加者２ＰＣ投票（vote）１５８と、一組の追加フラグ１６０と、メッセージのポインタオンディスク位置１６２とを含む。
したがって、キューエントリマネジメントテーブルは、ファイルの状況に関する正確な情報を提供し、より詳しくは任意のキューエントリに関する情報を提供する。
次に図９を参照すると、ここでは、単一メッセージは隣接ブロックに格納されるため、再処理は、隣接ブロックを読み出し返す（read back）ことを含む。この結果、読出し操作中のヘッドの動作を軽減する。
要するに、先行技術では、読出しを実行するために隣接しないブロックを読出しヘッドがトラバースすることを要求し、したがって、相当時間を要する可能性があった。当該システムにおいては、メッセージは隣接ブロックに格納されているため、読出し操作時にこれらの隣接ブロックをトラバースすることのみ必要となる。同様に、続いて起こる書込み操作ではヘッドは限定されたファイル量のみトラバースする。
要するに、次の書込みについてフォワード方向の流れがあり、循環するため、データは隣接ブロックに構成され、ここから上記の利点が生じる。
次に図１０を参照すると、図６のトランザクションログレコード１１２は、一実施態様における特殊なログレコードマーカ１６２を含む。本実施態様によると、シーケンス番号１６４は、QgetまたはQputのいずれかの操作を言及するメッセージ操作モード１６６とともに提供される。メッセージＩＤ１６８と、一組の操作フラグ１７０と、「アクティブ」、「ペンディング」「アボード」または「コミット」の状況を含むトランザクション状況１７２と、上述の参加者２ＰＣ投票１７４と、キューファイルにおけるメッセージのオンディスク位置を指すポインタ１７６が含まれる。
次に図１１を参照すると、書込みまたはQput操作のフローチャートが示されている。本フローチャートでは、１８０で図示されるように開始した後、他のユーザがヘッド入力にアクセスできないようにブロックキューヘッドポインタ１８２が効果的に一覧のヘッドをロックする。その後、システムはキューヘッドポインタを増加し、トランザクション状況を「アクティブ読出し」に設定する。これは、ハンドシェークプロセスの開始を示す。
１８６で図示されるように、システムはその後キューヘッドポインタのロックを解除し、その後１８８で図示されるように、メッセージをオンディスクキューファイルから読出す。次にQEMテーブルは、１９０で図示されるようにロックされ、ログレコードは、その後１９２で図示されるように書込まれ、QEMテーブルは、１９４で図示されるようにロックを解除される。QEMテーブルのロック解除ステップの出力は、メッセージ伝送がトランザクションのものであるかどうかを確認する決定ブロック１９６に当てはまる。トランザクションのものである場合、１９８で図示されるように、システムは二相「コミット」プロトコルを作動し、ハンドシェークを許容する。これによってQputまたは書込み操作が完了する。
次に図１２を参照して、Qgetまたは読出し操作について説明する。２００で図示されるように開始されて、２０２で図示されるようにキューテイルポインタがロックされ、新規のQEM入力が、２０４で図示されるようにキューテイルポインタを増加させて作成される。その後、２０６で図示されるように、システムはQEM入力制御情報を記入し、トランザクション状況を「アクティブ制御」に設定する。その後、２０８で図示されるように、キューテイルポインタはロックを解除され、QEMテーブルは、２１０で図示されるようにロックされる。
次に、２１２で図示されるように、決定ブロック２１４で示されるセグメントの境界線を横切るブロックと共に、システムはオンディスクブロックを予約表から割り当てる。ブロックがセグメント境界線を横切る場合、２１６で図示されるように、システムはQEMTチェックポイントのディスクへの書込みを強制する。これは、メモリ内コピーをディスクに書込むことを指す。ブロック２０６は、QEMテーブルの状態のメモリ内コピーおよびこれによって得られるQEM入力を更新することが理解される。
２１８で図示されるようにQEMTチェックポイントがディスクへの書込みを強制された後、当該システムは、メッセージデータをディスクに書込みQEMテーブルのロックを解除する。決定ブロック２２０は、メッセージがトランザクションのものであるかどうかを確定し、トランザクションのものである場合には、２２１で図示されるように二相コミットプロトコルを作動してハンドシェークを促進させる。書込みシーケンスの終了は２２２で図示される。ブロック２２０は、ハンドシェーキングプロトコルを動作している受け手末端を指す。
次に図１３を参照すると、回復シーケンスが図示され、２３０で図示されるような開始後、キューテーブルポインタは２３２で図示されるようにロックされ、システムはその後、２３４で図示されるようにグローバルデータ構造を再格納する。このことは、システムの状態を全体的に初期化する。その後、２３６で図示されるように、システムは最新のQEMTについてキューファイルにおける各QEMTを走査する。これによって、通信割込み前に最新のチェックポイントが確立される。その後、２３８で図示されるように、システムは最新のQEMTを有するログレコードについてこのセグメントのログレコードを走査する。これは、セグメントのログレコードがQEMTにおいての入力によって照会されるメッセージに適用されることを意味する。
決定ブロック２４０で図示されるように、システムは走査すべきログレコードがさらにあるかどうかを確認する。当該QEMTに関連するポインタに続いてQEMTは最新のログレコードを特定することが理解されよう。しかしながら、その後走査する必要のある次のログレコードが実際にある可能性がある。この場合、当該システムは、２４２で図示されるようにメッセージのトランザクション状況について参加者とコンタクトを取る。一例では、受信者はメッセージを受信したかどうかについて質問される。その後、システムは二相「コミット」プロトコルを呼出して、２４４で図示されるようにトランザクションを解決する。これは、ハンドシェーキングプロセスが２パスプロセスであることを示す。したがって、ある人が受信者から受信を返されるような状況であっても、この状況を利用して当該システムが停止した地点でハンドシェーキングプロセスを再開する。
２４６で明らかなように、当該システムは、予約表の状況を更新し新規ファイルポインタ位置を決定する。したがって、現行のセグメント番号１３０および現行のセグメント１３６において次に利用可能なブロックによって新規ファイルのポインタ位置を決定しながら、セクション全体が走査され、予約表１４０の状況が更新される。
２４８で図示されるように、システムは、２５０で図示されるように、回復が完了した地点で新規QEMTの状況をディスクに書き出す。
Ｃ言語で書かれたこの発明の１つの実施例のためのプログラミング・リスト出力が次に記載される。
0004280306.tif 000002
0004280306.tif 000003
0004280306.tif 000004
0004280306.tif 000005
0004280306.tif 000006
0004280306.tif 000007
0004280306.tif 000008
0004280306.tif 000009
0004280306.tif 000010
0004280306.tif 000011
0004280306.tif 000012
0004280306.tif 000013
0004280306.tif 000014
0004280306.tif 000015
0004280306.tif 000016
0004280306.tif 000017
0004280306.tif 000018
0004280306.tif 000019
0004280306.tif 000020
0004280306.tif 000021
0004280306.tif 000022
0004280306.tif 000023
0004280306.tif 000024
0004280306.tif 000025
0004280306.tif 000026
0004280306.tif 000027
0004280306.tif 000028
0004280306.tif 000029
0004280306.tif 000030
0004280306.tif 000031
0004280306.tif 000032
0004280306.tif 000033
0004280306.tif 000034
0004280306.tif 000035
0004280306.tif 000036
0004280306.tif 000037
0004280306.tif 000038
0004280306.tif 000039
0004280306.tif 000040
0004280306.tif 000041
0004280306.tif 000042
0004280306.tif 000043
0004280306.tif 000044
0004280306.tif 000045
0004280306.tif 000046
0004280306.tif 000047
0004280306.tif 000048
0004280306.tif 000049
0004280306.tif 000050
0004280306.tif 000051
0004280306.tif 000052
0004280306.tif 000053
0004280306.tif 000054
0004280306.tif 000055
0004280306.tif 000056
0004280306.tif 000057
0004280306.tif 000058
0004280306.tif 000059
0004280306.tif 000060
0004280306.tif 000061
0004280306.tif 000062
0004280306.tif 000063
0004280306.tif 000064
0004280306.tif 000065
0004280306.tif 000066
0004280306.tif 000067
0004280306.tif 000068
0004280306.tif 000069
0004280306.tif 000070
0004280306.tif 000071
0004280306.tif 000072
0004280306.tif 000073
0004280306.tif 000074
0004280306.tif 000075
0004280306.tif 000076
0004280306.tif 000077
0004280306.tif 000078
0004280306.tif 000079
0004280306.tif 000080
0004280306.tif 000081
0004280306.tif 000082
0004280306.tif 000083
0004280306.tif 000084
0004280306.tif 000085
0004280306.tif 000086
0004280306.tif 000087
0004280306.tif 000088
0004280306.tif 000089
0004280306.tif 000090
0004280306.tif 000091
0004280306.tif 000092
0004280306.tif 000093
0004280306.tif 000094
0004280306.tif 000095
0004280306.tif 000096
0004280306.tif 000097
0004280306.tif 000098
0004280306.tif 000099
0004280306.tif 000100
0004280306.tif 000101
0004280306.tif 000102
0004280306.tif 000103
0004280306.tif 000104
0004280306.tif 000105
0004280306.tif 000106
0004280306.tif 000107
0004280306.tif 000108
0004280306.tif 000109
0004280306.tif 000110
0004280306.tif 000111
0004280306.tif 000112
0004280306.tif 000113
0004280306.tif 000114
0004280306.tif 000115
0004280306.tif 000116
0004280306.tif 000117
0004280306.tif 000118
0004280306.tif 000119
0004280306.tif 000120
0004280306.tif 000121
0004280306.tif 000122
0004280306.tif 000123
0004280306.tif 000124
0004280306.tif 000125
0004280306.tif 000126
0004280306.tif 000127
0004280306.tif 000128
0004280306.tif 000129
0004280306.tif 000130
0004280306.tif 000131
0004280306.tif 000132
0004280306.tif 000133
0004280306.tif 000134
0004280306.tif 000135
0004280306.tif 000136
0004280306.tif 000137
0004280306.tif 000138
0004280306.tif 000139
0004280306.tif 000140
0004280306.tif 000141
0004280306.tif 000142
0004280306.tif 000143
0004280306.tif 000144
0004280306.tif 000145
0004280306.tif 000146
0004280306.tif 000147
0004280306.tif 000148
0004280306.tif 000149
0004280306.tif 000150
0004280306.tif 000151
0004280306.tif 000152
0004280306.tif 000153
0004280306.tif 000154
0004280306.tif 000155
0004280306.tif 000156
0004280306.tif 000157
0004280306.tif 000158
0004280306.tif 000159
0004280306.tif 000160
0004280306.tif 000161
0004280306.tif 000162
0004280306.tif 000163
0004280306.tif 000164
0004280306.tif 000165
0004280306.tif 000166
0004280306.tif 000167
0004280306.tif 000168
0004280306.tif 000169
0004280306.tif 000170
0004280306.tif 000171
0004280306.tif 000172
0004280306.tif 000173
0004280306.tif 000174
0004280306.tif 000175
0004280306.tif 000176
0004280306.tif 000177
0004280306.tif 000178
0004280306.tif 000179
0004280306.tif 000180
0004280306.tif 000181
0004280306.tif 000182
0004280306.tif 000183
0004280306.tif 000184
0004280306.tif 000185
0004280306.tif 000186
0004280306.tif 000187
0004280306.tif 000188
0004280306.tif 000189
0004280306.tif 000190
0004280306.tif 000191
0004280306.tif 000192
0004280306.tif 000193
0004280306.tif 000194
0004280306.tif 000195
0004280306.tif 000196
0004280306.tif 000197
0004280306.tif 000198
0004280306.tif 000199
0004280306.tif 000200
0004280306.tif 000201
0004280306.tif 000202
0004280306.tif 000203
0004280306.tif 000204
0004280306.tif 000205
0004280306.tif 000206
0004280306.tif 000207
0004280306.tif 000208
0004280306.tif 000209
0004280306.tif 000210
0004280306.tif 000211
0004280306.tif 000212
0004280306.tif 000213
0004280306.tif 000214
0004280306.tif 000215
0004280306.tif 000216
0004280306.tif 000217
0004280306.tif 000218
0004280306.tif 000219
0004280306.tif 000220
0004280306.tif 000221
0004280306.tif 000222
0004280306.tif 000223
0004280306.tif 000224
0004280306.tif 000225
0004280306.tif 000226
0004280306.tif 000227
0004280306.tif 000228
0004280306.tif 000229
0004280306.tif 000230
0004280306.tif 000231
0004280306.tif 000232
0004280306.tif 000233
0004280306.tif 000234
0004280306.tif 000235
0004280306.tif 000236
0004280306.tif 000237
0004280306.tif 000238
0004280306.tif 000239
0004280306.tif 000240
0004280306.tif 000241
0004280306.tif 000242
0004280306.tif 000243
0004280306.tif 000244
0004280306.tif 000245
0004280306.tif 000246
0004280306.tif 000247
0004280306.tif 000248
0004280306.tif 000249
0004280306.tif 000250
0004280306.tif 000251
0004280306.tif 000252
0004280306.tif 000253
0004280306.tif 000254
0004280306.tif 000255
0004280306.tif 000256
0004280306.tif 000257
0004280306.tif 000258
0004280306.tif 000259
0004280306.tif 000260
0004280306.tif 000261
0004280306.tif 000262
0004280306.tif 000263
0004280306.tif 000264
0004280306.tif 000265
0004280306.tif 000266
0004280306.tif 000267
0004280306.tif 000268
0004280306.tif 000269
0004280306.tif 000270
0004280306.tif 000271
0004280306.tif 000272
0004280306.tif 000273
0004280306.tif 000274
0004280306.tif 000275
0004280306.tif 000276
0004280306.tif 000277
0004280306.tif 000278
0004280306.tif 000279
0004280306.tif 000280
0004280306.tif 000281
0004280306.tif 000282
0004280306.tif 000283
0004280306.tif 000284
0004280306.tif 000285
0004280306.tif 000286
0004280306.tif 000287
0004280306.tif 000288
0004280306.tif 000289
0004280306.tif 000290
0004280306.tif 000291
0004280306.tif 000292
0004280306.tif 000293
0004280306.tif 000294
0004280306.tif 000295
0004280306.tif 000296
0004280306.tif 000297
0004280306.tif 000298
0004280306.tif 000299
0004280306.tif 000300
0004280306.tif 000301
0004280306.tif 000302
0004280306.tif 000303
0004280306.tif 000304
0004280306.tif 000305
0004280306.tif 000306
0004280306.tif 000307
0004280306.tif 000308
0004280306.tif 000309
0004280306.tif 000310
0004280306.tif 000311
0004280306.tif 000312
0004280306.tif 000313
0004280306.tif 000314
0004280306.tif 000315
0004280306.tif 000316
0004280306.tif 000317
0004280306.tif 000318
0004280306.tif 000319
0004280306.tif 000320
0004280306.tif 000321
0004280306.tif 000322
0004280306.tif 000323
0004280306.tif 000324
0004280306.tif 000325
0004280306.tif 000326
0004280306.tif 000327
0004280306.tif 000328
0004280306.tif 000329
0004280306.tif 000330
0004280306.tif 000331
0004280306.tif 000332
0004280306.tif 000333
0004280306.tif 000334
0004280306.tif 000335
0004280306.tif 000336
0004280306.tif 000337
0004280306.tif 000338
0004280306.tif 000339
0004280306.tif 000340
0004280306.tif 000341
0004280306.tif 000342
0004280306.tif 000343
0004280306.tif 000344
0004280306.tif 000345
0004280306.tif 000346
0004280306.tif 000347
0004280306.tif 000348
0004280306.tif 000349
0004280306.tif 000350
0004280306.tif 000351
0004280306.tif 000352
0004280306.tif 000353
0004280306.tif 000354
0004280306.tif 000355
0004280306.tif 000356
0004280306.tif 000357
0004280306.tif 000358
0004280306.tif 000359
0004280306.tif 000360
0004280306.tif 000361
0004280306.tif 000362
0004280306.tif 000363
0004280306.tif 000364
0004280306.tif 000365
0004280306.tif 000366
0004280306.tif 000367
0004280306.tif 000368
0004280306.tif 000369
0004280306.tif 000370
0004280306.tif 000371
0004280306.tif 000372
0004280306.tif 000373
0004280306.tif 000374
0004280306.tif 000375
0004280306.tif 000376
0004280306.tif 000377
0004280306.tif 000378
0004280306.tif 000379
0004280306.tif 000380
0004280306.tif 000381
0004280306.tif 000382
0004280306.tif 000383
0004280306.tif 000384
0004280306.tif 000385
0004280306.tif 000386
0004280306.tif 000387
0004280306.tif 000388
0004280306.tif 000389
0004280306.tif 000390
0004280306.tif 000391
0004280306.tif 000392
0004280306.tif 000393
0004280306.tif 000394
0004280306.tif 000395
0004280306.tif 000396
0004280306.tif 000397
0004280306.tif 000398
0004280306.tif 000399
0004280306.tif 000400
0004280306.tif 000401
0004280306.tif 000402
0004280306.tif 000403
0004280306.tif 000404
0004280306.tif 000405
0004280306.tif 000406
0004280306.tif 000407
0004280306.tif 000408
0004280306.tif 000409
0004280306.tif 000410
0004280306.tif 000411
0004280306.tif 000412
0004280306.tif 000413
0004280306.tif 000414
0004280306.tif 000415
0004280306.tif 000416
0004280306.tif 000417
0004280306.tif 000418
0004280306.tif 000419
0004280306.tif 000420
0004280306.tif 000421
0004280306.tif 000422
0004280306.tif 000423
0004280306.tif 000424
0004280306.tif 000425
0004280306.tif 000426
0004280306.tif 000427
0004280306.tif 000428
0004280306.tif 000429
0004280306.tif 000430
0004280306.tif 000431
0004280306.tif 000432
0004280306.tif 000433
0004280306.tif 000434
0004280306.tif 000435
0004280306.tif 000436
0004280306.tif 000437
0004280306.tif 000438
0004280306.tif 000439
0004280306.tif 000440
0004280306.tif 000441
0004280306.tif 000442
0004280306.tif 000443
0004280306.tif 000444
0004280306.tif 000445
0004280306.tif 000446
0004280306.tif 000447
0004280306.tif 000448
0004280306.tif 000449
0004280306.tif 000450
0004280306.tif 000451
0004280306.tif 000452
0004280306.tif 000453
0004280306.tif 000454
0004280306.tif 000455
0004280306.tif 000456
0004280306.tif 000457
0004280306.tif 000458
0004280306.tif 000459
0004280306.tif 000460
0004280306.tif 000461
0004280306.tif 000462
0004280306.tif 000463
0004280306.tif 000464
0004280306.tif 000465
0004280306.tif 000466
0004280306.tif 000467
0004280306.tif 000468
0004280306.tif 000469
0004280306.tif 000470
0004280306.tif 000471
0004280306.tif 000472
0004280306.tif 000473
0004280306.tif 000474
0004280306.tif 000475
0004280306.tif 000476
0004280306.tif 000477
0004280306.tif 000478
0004280306.tif 000479
0004280306.tif 000480
0004280306.tif 000481
0004280306.tif 000482
0004280306.tif 000483
0004280306.tif 000484
0004280306.tif 000485
0004280306.tif 000486
0004280306.tif 000487
0004280306.tif 000488
0004280306.tif 000489
0004280306.tif 000490
0004280306.tif 000491
0004280306.tif 000492
0004280306.tif 000493
0004280306.tif 000494
0004280306.tif 000495
0004280306.tif 000496
0004280306.tif 000497
0004280306.tif 000498
0004280306.tif 000499
0004280306.tif 000500
0004280306.tif 000501
0004280306.tif 000502
0004280306.tif 000503
0004280306.tif 000504
0004280306.tif 000505
0004280306.tif 000506
0004280306.tif 000507
0004280306.tif 000508
0004280306.tif 000509
0004280306.tif 000510
0004280306.tif 000511
0004280306.tif 000512
0004280306.tif 000513
0004280306.tif 000514
0004280306.tif 000515
0004280306.tif 000516
0004280306.tif 000517
0004280306.tif 000518
0004280306.tif 000519
0004280306.tif 000520
0004280306.tif 000521
0004280306.tif 000522
0004280306.tif 000523
0004280306.tif 000524
0004280306.tif 000525
0004280306.tif 000526
0004280306.tif 000527
0004280306.tif 000528
0004280306.tif 000529
0004280306.tif 000530
0004280306.tif 000531
0004280306.tif 000532
0004280306.tif 000533
0004280306.tif 000534
【図１】
0004280306.tif 000535
【図２】
0004280306.tif 000536
【図３】
0004280306.tif 000537
【図４】
0004280306.tif 000538
【図５】
0004280306.tif 000539
【図６】
0004280306.tif 000540
【図７】
0004280306.tif 000541
【図８】
0004280306.tif 000542
【図９】
0004280306.tif 000543
【図１０】
0004280306.tif 000544
【図１１】
0004280306.tif 000545
【図１２】
0004280306.tif 000546
【図１３】
0004280306.tif 000547