説明

ポリシーベースのメッセージ集約フレームワーク

送信元アプリケーションによって作成されたメッセージが、構成ポリシーに基づいてバッチへと集約される。この構成ポリシーは、メッセージをバッチへと集約するために使用されるビジネスロジックを含む。バッチは、完成すると、単一のストリーム出力へとフォーマットされ、それらのメッセージを受信するように設計されている送信先アプリケーションへ送信される。メッセージは、送信元アプリケーションによってコントロールされるバッチへと集約することもできる。それらのメッセージは、バッチが完成するときに知らせるように送信元アプリケーションによって設定されたインジケータを含む。バッチは、完成すると、単一のストリーム出力へとフォーマットされ、それらのメッセージを受信するように設計されている送信先アプリケーションへ送信される。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ポリシーベースのメッセージ集約フレームワークに関する。
【背景技術】
【0002】
今日のグローバル経済においては、企業は、多くの場合、様々なソースからアプリケーション、システム、およびテクノロジーを統合する必要がある。通常、これらの企業は、合意されたメッセージ標準によって、あるコンピュータアプリケーションから別のコンピュータアプリケーションへ電子的な手段によって、かつ人間の介入を最小限に抑えて、構造化された情報をコンピュータどうしでやり取りするためのシステムを作成する。メッセージ標準の例としては、ヘルスケア関連の臨床データおよび管理データのためのHL7(Health Level Seven)、製品、資産、サービス、および場所に関する情報を識別および通信するためのGS1システム、金融データのためのSWIFT、および様々なビジネス取引データを転送するための合意されたメッセージ標準によって、構造化された情報をやり取りするためのEDIが含まれる。
【0003】
図1に示されているように、ある企業は、様々なメッセージフォーマットで様々な提携先と通信する可能性がある。例えば、その企業は、XMLフォーマットで顧客と通信する可能性があり、その企業は、EDIまたはFlat Fileメッセージフォーマットでサプライヤアプリケーションと通信する可能性があり、その企業は、SWIFTメッセージフォーマットで金融アプリケーションと通信する可能性があり、またその企業は、その他の何らかの業界標準メッセージフォーマットでロジスティクスアプリケーションと通信する可能性がある。
【発明の開示】
【発明が解決しようとする課題】
【0004】
残念なことに、メッセージの数が増えて多様になると、典型的な企業においては、通信が複雑になり、非効率がもたらされる。メッセージを集約するためのソリューションをカスタムソフトウェアコードで書くことができるが、そのようなソリューションは、企業における複雑さおよびコストを増大させるものであり、また特定の状況に適しているにすぎない。
【課題を解決するための手段】
【0005】
本発明の態様は、構造化されたメッセージをコンピュータどうしでやり取りする公知の形態における1つまたは複数の欠陥を克服する。拡張可能な、ポリシーベースのメッセージ集約フレームワークが、メッセージをバッチへと集約し、それによって、複数のメッセージを単一の出力ストリームとして送信先アプリケーション(destination application)へ伝送することができる。
【0006】
一態様においては、本発明は、ポリシーベースのメッセージ集約を含み、ここでの集約は、メッセージをバッチへと集約するために使用されるビジネスロジックを含むポリシーに基づく。別の態様においては、本発明は、アプリケーションベースのメッセージ集約を含み、この集約では、送信元アプリケーション(source application)が、メッセージ内にインジケータを設定し、それらのインジケータは、バッチにまとめるべきメッセージを識別し、そのバッチが完成するときに知らせる。
【0007】
典型的な企業は、重要なビジネス上のコミュニケーションに関連する多くのメッセージを作成するため、本発明の態様を具体化するメッセージ集約システムは、信頼性および拡張性が高い。また、メッセージを蓄積し、そしてそれらのメッセージを伝送するのに使用される通信媒体に関するコストが最も低いときにそれらのメッセージを送信することによってコストを下げるために、およびメッセージの束を一度に伝送して、単一のメッセージを送信することに関連するオーバヘッドを低減することによってパフォーマンスを高めるために、メッセージの集約を実施することもできる。
【0008】
メッセージ集約のためのコンピュータ実行可能命令を有するコンピュータ可読媒体が、本発明のさらなる態様を具体化する。あるいは本発明の実施形態は、その他の様々な方法および装置を含むこともできる。
【0009】
この概要は、以降の「発明を実施するための最良の形態」においてさらに説明するコンセプトから抜粋したものを、簡略化された形式で紹介するために提供されている。この「課題を解決するための手段」は、特許請求されている主題の鍵となる特徴や必要不可欠な特徴を特定することを意図するものではなく、特許請求されている主題の範囲を確定する際の補助として使用されることを意図するものでもない。
【0010】
その他の特徴については、一部は明らかであろうし、また一部は以降で指摘する。
【0011】
対応する参照文字は、複数の図面を通じて、対応する部分を指す。
【発明を実施するための最良の形態】
【0012】
図面を参照すると、図2は、メッセージ集約のためのコンピューティングシステム環境の一実施形態を示している。複数のビジネスニーズを満たすためにメッセージの集約を実施することができる。例えば、ある企業は、様々なメッセージフォーマットで様々な提携先と通信する。メッセージの集約によって、指定の時点において通信を提供しながら、より低いコストでパフォーマンスを高めることができる。この例においては、この企業は、毎週1回サプライヤに用品を注文するというポリシーを有しているかもしれない。あるアプリケーションは、この企業が、サプライヤに宛てたメッセージを作成することによってその週の間中用品を注文することを可能にすることができる。本発明の実施形態は、これらのメッセージを、実行処理のためにサプライヤのアプリケーションへ毎週1回伝送するための、企業における1つのバッチへと集約することができる。
【0013】
別の例として、ある企業が、顧客から多数の購入注文を受けていると想像していただきたい。それぞれの顧客の購入注文を実行するために、この企業は、提携先企業に品物を注文し、そしてこの企業は、EDIを使用してその提携先に注文を伝達する。しかし、その提携先企業への接続は、1日の特定の時間にしか利用できない。したがって、この企業は、その提携先に関するすべての注文を蓄積して、それらの注文を1日の適切な時間中に送信する必要がある。さらに企業は、多くの場合、提携先への接続時間の代金を支払わなければならない。この場合、すべてのメッセージを束ねて、数時間ごとに1回程度接続を開き、メッセージの単一の束を一度に伝送することが有利である。さらに本発明の態様は、XML、EDI、Flat File、SWIFT、あるいはその他の何らかの業界標準メッセージフォーマットなど、様々なメッセージフォーマットでメッセージを集約することができる。
【0014】
図2に示されているように、送信元アプリケーション202が、メッセージを作成し、送信する。送信ポートに宛てられたメッセージを送信することは、当業者にはよく知られている。メッセージングエンジン204が、それぞれのメッセージを受信し、メッセージアドレスにおいて送信ポートに関連付けられている1つまたは複数のバッチャー(batcher)206が、本発明の態様に従ってメッセージを受信し、集約する。一実施形態においては、送信元アプリケーション202および送信先アプリケーション212は、エンドポイントを介してメッセージングエンジン204と通信する。エンドポイントとは、ある場所の(例えば、URL形式で表された)論理的な表示であり、受信または送信されるデータのための物理アドレスを提供する。この実施形態におけるエンドポイントは、双方向のものであり、メッセージングエンジン204内へメッセージをくみ上げるために、ならびにメッセージングエンジン204からメッセージを出すために使用される。
【0015】
別の実施形態においては、メッセージングエンジン204はまた、メッセージをデータストア208へ書き込む。バッチ内のメッセージどうしが相互に独立している場合には、本発明の態様は、ビジネス構成ポリシー(business configuration policy)によって定義されている選択されたパラメータに基づいてそれらのメッセージを組み立てることができる。例えばバッチ構成ポリシー(batch configuration policy)は、バッチ内のメッセージの数、バッチ内の累積バイト数、バッチ内のメッセージのタイプ、および/またはメッセージを蓄積するための時間を決定するために使用されるビジネスロジックを含む。
【0016】
一実施形態においては、バッチャー206は、送信ポート上に構成される(例えば、BatcherType & BatcherLocation)。例えば、このためにアダプタフレームワークコードベース(adapter framework code base)を活用することができ、そしてそのアダプタフレームワークコードベースによって、この構成およびその他の送信ポート構成情報を保存するためのインターフェースが実装される。付録Aは、バッチャーインターフェース(batcher interface)を含む、本発明の態様を具体化するアウトバウンドバッチング(outbound batching)のためのメッセージングフレームワークの例示的な一実装形態を示している。
【0017】
別の実施形態においては、メッセージングエンジン204は、1つまたは複数のバッチャー206に関するインスタンス状態402(図4を参照されたい)を保持する。インスタンス状態402は、バッチャー206に関連付けられている送信ポートと、その送信ポートに宛てられているメッセージのリストとを含む。インスタンス状態402は、データストア208内に保存することができる。それらのインスタンス状態は、システム障害の場合にそれぞれのバッチャーインスタンスに対応するメッセージを検索するために使用される。
【0018】
特定の送信ポートに関連付けられているバッチャー206が存在しない場合には、メッセージングエンジン204が、そのバッチャー206を作成することになる。それぞれのバッチャー206を動的に作成することによって、必要に応じてバッチャーが作成され、それによって、このメッセージ集約システムの拡張性が促進される。さらに、バッチャー206を動的に作成することは、使用されていないバッチャーのオーバヘッドをなくすこと、およびメッセージングエンジン204が、アクティブなバッチャー206に関してのみインスタンス状態402を管理できるようにすることによって、システムパフォーマンスを補助する。
【0019】
インスタンス状態402およびメッセージをデータストア208内に保存することによって、システム障害の場合にバッチを回復することができる。一実施形態においては、再開後に、メッセージングエンジン204は、障害時に進行していたバッチのインスタンス状態402にアクセスすることができる。それぞれのインスタンス状態402ごとに、メッセージングエンジン204は、バッチャー206のインスタンスを作成する。インスタンス状態402のメッセージリスト内のそれぞれのメッセージごとに、メッセージングエンジン204は、それらのメッセージをバッチャー206に再送する。リスト内のそれらのメッセージがバッチャー206に再送されると、そのバッチは、障害時と同じ状態になる。
【0020】
例えばインスタンス状態402は、アプリケーションインスタンス(この場合は、Assembler/Batcher Instance)の状態を保存するための場所である。アプリケーションインスタンスに対応するメッセージは、データストア内に保存されるが、アプリケーションがインスタンス情報を検索して障害後に処理を継続できるように、アプリケーションインスタンスの状態に関する情報を保存する必要もある。サブスクリプション(subscription)は、インスタンス状態とは無関係である。サブスクリプションテーブルは、特定の条件を満たすメッセージを受信する(Service IDによって識別される)サービスのリストを定義する。メッセージがメッセージボックス(例えばデータストア108)に発行されると、メッセージボックスは、条件を評価し、どのサービスがそのメッセージを受信することになるかを識別する。そしてメッセージボックスは、そのサービスの論理インスタンスを「Instances」テーブル内に作成し、そのメッセージ上に「InstanceID」をスタンプしてからそのメッセージをメッセージングエンジン204へ送信する。
【0021】
別の実施形態においては、メッセージは、バッチャー206に関連付けられているバッチャー識別子を含む。この実施形態においては、メッセージボックスは、特定の条件を満たすメッセージを受信する(Service IDによって識別される)サービスのリストを定義するサブスクリプションテーブル408を保持する。メッセージボックスは、送信元アプリケーション202からメッセージを受信する。そのメッセージがメッセージボックスに発行されると、メッセージボックスは、条件を評価し、どのサービスがそのメッセージを受信することになるかを判断する。そして、そのサービスのためのバッチャー206のインスタンスが存在しない場合には、メッセージボックスがそのインスタンスを作成する。次いでメッセージボックスは、そのメッセージをメッセージングエンジン204へ送信する。メッセージングエンジン204は、バッチ識別子をハッシュして、バッチャー206の正しいインスタンスを特定する。そしてメッセージングエンジン204は、特定したバッチャー206にメッセージを送信する。
【0022】
バッチャー206は、メッセージを受信すると、メッセージのバッチが完成しているかどうかを判断する。一実施形態においては、バッチャー206は、バッチ構成ポリシーに関してそのバッチが完成しているかどうかを判断する。バッチ構成ポリシーは、いつバッチが完成するかを判断するために使用されるビジネスロジックを含む。このビジネスロジックは、バッチ内のメッセージの数、バッチ内の累積バイト数、バッチ内のメッセージのタイプ、およびメッセージを蓄積するための時間のうちの1つまたは複数を含むことができる。別の実施形態においては、ビジネスロジックは、バッチ内のメッセージに関する所望のソート順序を含むことができ、これによってバッチャー206は、バッチ内のメッセージをソートすることができる。
【0023】
メッセージアドレスにおいて送信ポートに関連付けられているバッチャー206が、本発明の態様に従ってメッセージを受信し、集約する。上述のように、バッチ内のメッセージどうしは、相互に独立することができる。別の実施形態においては、バッチ内のメッセージどうしは相互に依存し、それらのメッセージを作成しているコードは、新たなバッチがいつ開始されることになるか、そしてそのバッチがいつ完成するべきかを把握している。この実施形態においては、メッセージは、バッチ完成インジケータ(batch end indicator)を含む。そのバッチが完成していることをバッチ完成インジケータが示しているならば、バッチャー206は、そのバッチを完成したことになる。
【0024】
バッチャー206は、バッチが完成していると判断すると、そのバッチをメッセージングエンジン204へ返す。メッセージングエンジン204は、そのバッチをアセンブラ210へ送信する。次にアセンブラ210は、そのバッチ内のすべてのメッセージを順番に並べて、単一の出力ストリームにする。ある代替実施形態においては、バッチャー206が自ら、バッチにまとめられたすべてのメッセージを順番に並べて、単一の出力ストリームにする。アセンブラ210は、そのメッセージストリームを、それらのメッセージを受信するように設計されているアプリケーションに関連付けられている送信先アプリケーション212へ送信する。
【0025】
図3は、メッセージ集約の一実施形態の態様を示す例示的な流れ図である。302において、メッセージングエンジン204は、送信ポートに宛てられているメッセージを送信元アプリケーション202から受信する。304において、メッセージングエンジン204は、送信ポートに関連付けられているバッチャー206のインスタンスが存在することを確認する。送信ポートに関連付けられているバッチャー206のインスタンスが存在する場合には、その関連付けられているバッチャー206が、共通の送信ポートに宛てられているメッセージを集約する。一方、送信ポートに関連付けられているバッチャー206が存在しない場合には、そのバッチャーのインスタンスが、306において作成される。
【0026】
別の実施形態においては、メッセージは、特定のバッチャー206に関連付けられているバッチャー識別子を含む。この実施形態においては、本発明の態様は、そのバッチ識別子に関連付けられているバッチャー206のインスタンスが存在することを確認するためにチェックを実行する。バッチ識別子に関連付けられているバッチャー206が存在しない場合には、そのバッチャーのインスタンスが、306において作成される。
【0027】
図3をさらに参照すると、メッセージングエンジン204は、308において、メッセージアドレスにおいて送信ポートに関連付けられているバッチャー206へメッセージを送信する。310において、バッチャー206は、メッセージのバッチが完成しているかどうかを判断する。一実施形態においては、バッチャー206は、バッチ構成ポリシーに関してそのバッチが完成しているかどうかを判断し、そのバッチ構成ポリシーは、この判断を行うために使用されるビジネスロジックを含む。上述のように、このビジネスロジックは、バッチ内のメッセージの数、バッチ内の累積バイト数、バッチ内のメッセージのタイプ、およびメッセージを蓄積するための時間のうちの1つまたは複数を含むことができる。有利なことに、顧客は、バッチ構成ポリシーによってメッセージをバッチにまとめるための独自の基準を設定することができる。さらにバッチャー206は、バッチ構成ポリシーによって定義されている所望のソート順序に従ってバッチ内のメッセージをソートすることができる。
【0028】
310において、バッチが完成していないとバッチャー206が判断した場合には、そのバッチのインスタンス状態402が、312において更新されることになる。インスタンス状態402は、バッチャー206に関連付けられている送信ポートと、その送信ポートに宛てられているメッセージのリストとを含む。インスタンス状態402は、データストア208内に保存することができる。一方、310において、バッチが完成しているとバッチャー206が判断した場合には、314において、そのバッチからメッセージセットが作成される。316において、バッチャー206は、そのメッセージセットをアセンブラへ送信し、そのアセンブラでは、メッセージが、送信先アプリケーション212へ単一の出力ストリームで送信される。送信先アプリケーション212は、例えば顧客アプリケーション、サプライヤアプリケーション、あるいは金融アプリケーションとすることができる。出力ストリームは、送信先アプリケーション212により指定されたように、EDIフォーマット、SWIFTフォーマット、GS1システム、HL7、あるいはその他の何らかの業界標準フォーマットのものとすることができる。出力ストリームが送信されると、312において、バッチャーのインスタンス状態402が更新される。
【0029】
一実施形態においては、メッセージングエンジン204が、314においてバッチャーのためのメッセージセットを作成している間に、または316においてそのメッセージセットをアセンブラへ送信している間に、302においてバッチャー206のための新たなメッセージが受信された場合には、メッセージングエンジン204は、308においてバッチャー206の新たなインスタンスを作成することになる。処理は、バッチャー206のこの新たなインスタンスに関して306から続くことになる。これによって、メッセージングエンジン204は、並行バッチ(concurrent batches)を処理することができ、ここでバッチャー206の新たなインスタンスに関して新たなバッチが開始される一方、1つのバッチがアセンブラ210へ送信される。
【0030】
例えば、バッチが完成しているとバッチャー206が判断した場合には、メッセージングエンジン204は、そのことに留意し、単一の出力ストリームをアセンブラ210に渡す。しかし、その間にメッセージングエンジン204が、その同じ送信ポートのための新たなメッセージを受信した場合には、メッセージングエンジン204は、前のバッチが完成していることを認識し、新たなバッチャー206を、したがって新たなバッチを作成することになる。複数のインフライトバッチャー(inflight batcher)206が、「batcherID」によって識別される。
【0031】
図4は、汎用コンピューティングデバイスの一例をサーバ430の形態で示している。本発明の一実施形態においては、サーバ430などのサーバは、本明細書で例示および説明されているその他の図において使用することにも適している。サーバ430は、1つまたは複数のプロセッサまたは処理装置と、システムメモリとを有する。図示されている実施形態においては、システムバスは、システムメモリを含む様々なシステムコンポーネントをプロセッサに結合している。
【0032】
サーバ430は通常、少なくとも何らかの形態のコンピュータ可読媒体を有する。コンピュータ可読媒体は、揮発性媒体および不揮発性媒体、ならびに取り外し可能な媒体および固定の媒体の双方を含み、サーバ430によってアクセスできる利用可能な任意の媒体とすることができる。例えばコンピュータ可読媒体は、コンピュータ記憶媒体および通信媒体を含むが、これらには限定されない。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、あるいはその他のデータなどの情報を記憶するための任意の方法や技術において実装される揮発性媒体および不揮発性媒体、ならびに取り外し可能な媒体および固定の媒体を含む。例えばコンピュータ記憶媒体は、RAM、ROM、EEPROM、フラッシュメモリ、またはその他のメモリ技術、CD−ROM、DVD(digital versatile disk)、またはその他の光ディスクストレージ、磁気カセット、磁気テープ、データストア108などの磁気ディスクストレージ、またはその他の磁気ストレージデバイス、あるいは所望の情報を記憶するために使用可能で、サーバ430によってアクセス可能なその他の任意の媒体を含む。通信媒体は通常、搬送波やその他の伝送メカニズムなどの変調されたデータ信号内のコンピュータ可読命令、データ構造、プログラムモジュール、あるいはその他のデータを具体化し、任意の情報伝達媒体を含む。変調されたデータ信号とは、当業者にはよく知られたものであり、情報をその信号内でコード化するような方法で設定または変更されたその特性のうちの1つまたは複数を有する。有線ネットワークや直接有線接続などの有線媒体、および音響媒体、RF媒体、赤外線媒体、その他の無線媒体などの無線媒体は、通信媒体の例である。また上記のいずれの組合せも、コンピュータ可読媒体の範囲内に含まれるものである。
【0033】
サーバ430は、その他の取り外し可能な/固定の、揮発性/不揮発性コンピュータ記憶媒体を含むこともできる。この例示的な動作環境において使用することができるその他の取り外し可能な/固定の、揮発性/不揮発性コンピュータ記憶媒体としては、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、ソリッドステートRAM、ソリッドステートROMなどが含まれるが、これらには限定されない。
【0034】
図4に示されている上述のドライブ、またはその他のマスストレージデバイス、およびそれらに関連付けられているコンピュータ記憶媒体は、サーバ430のためのコンピュータ可読命令、データ構造、プログラムモジュール102、104、106、110、およびその他のデータ402、404の記憶を提供する。
【0035】
サーバ430は、リモートサーバ406A、406B、406Cなどの1つまたは複数のリモートサーバへの論理接続を使用して、ネットワーク化された環境内で機能することができる。リモートサーバは、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、あるいはその他の一般的なネットワークノードとすることができ、通常は、サーバ430に関連する上述の要素の多くまたはすべてを含む。図4に示されている論理接続は、LAN(local area network)およびWAN(wide area network)を含むが、その他のネットワークを含むこともできる。LANおよび/またはWANは、有線ネットワーク、無線ネットワーク、それらの組合せなどとすることができる。このようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネット、および全世界規模のコンピュータネットワーク(例えばインターネット)においてよく見受けられる。
【0036】
ローカルエリアネットワーキング環境において使用する場合には、サーバ430は、ネットワークインターフェースまたはアダプタを通じてLANに接続される。ワイドエリアネットワーキング環境において使用する場合には、サーバ430は通常、インターネットなどのWAN上で通信を確立するためのモデムやその他の手段を含む。モデムは、内蔵型とすることもでき、あるいは外付け型とすることもでき、ユーザ入力インターフェースやその他の適切なメカニズムを介してシステムバスに接続される。ネットワーク化された環境においては、コンピュータ130に関連して示されているプログラムモジュールやそれらの一部をリモートメモリストレージデバイス(図示せず)内に格納することができる。示されているネットワーク接続は例示的なものであり、コンピュータどうしの間に通信リンクを確立するその他の手段を使用することもできる。
【0037】
一般にサーバ430のデータプロセッサは、別々の時点でコンピュータの様々なコンピュータ可読記憶媒体内に格納された命令によってプログラムされる。プログラムおよびオペレーティングシステムは通常、例えばフロッピー(登録商標)ディスクやCD−ROMで配布される。そこから、これらはコンピュータの2次メモリ内へインストールまたはロードされる。実行時には、これらは少なくとも一部がコンピュータの1次電子メモリ内へロードされる。これらおよびその他の様々なタイプのコンピュータ可読記憶媒体が、後述のステップを実施するための命令やプログラムをマイクロプロセッサやその他のデータプロセッサと共に含む場合には、そのような媒体は、本明細書に記載されている本発明の態様に含まれる。さらに、コンピュータが、本明細書に記載の方法および技術に従ってプログラムされる場合には、そのコンピュータ自体も本発明の態様に含まれる。
【0038】
例示の目的から、オペレーティングシステムなどのプログラムおよびその他の実行可能なプログラムコンポーネントは、本明細書では別個のブロックとして示されている。しかし、そのようなプログラムおよびコンポーネントは、様々な時点においてコンピュータの別々のストレージコンポーネント内に存在し、コンピュータの(1つまたは複数の)データプロセッサによって実行されるということを認識されたい。
【0039】
サーバ430を含む例示的なコンピューティングシステム環境との関連から説明したが、本発明の実施形態は、その他の多くの汎用または専用のコンピューティングシステム環境または構成と共に使用することができる。このコンピューティングシステム環境は、本発明のいかなる態様の使用や機能の範囲に関しても何らかの限定を提示することを意図するものではない。さらに、このコンピューティングシステム環境は、この例示的な動作環境内に示されているコンポーネントのうちの任意の1つまたは組合せに関して何らかの依存性や必要性を有すると解釈すべきではない。本発明の態様と共に使用するのに適する可能性のあるよく知られているコンピューティングシステム、環境、および/または構成の例は、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスやラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な家庭用電化製品、携帯電話、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記のシステムやデバイスのうちのいずれかを含む分散コンピューティング環境などを含むが、これらには限定されない。
【0040】
本発明の実施形態については、1つまたは複数のコンピュータやその他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令という一般的なコンテキストにおいて説明することができる。一般にプログラムモジュールは、特定のタスクを実行したり特定の抽象データ型を実装したりするルーチン、プログラム、オブジェクト、コンポーネント、およびデータ構造を含むが、これらには限定されない。本発明の態様は、通信ネットワークを通じてリンクされているリモート処理デバイスによってタスクが実行される分散コンピューティング環境において実施することもできる。分散コンピューティング環境においては、プログラムモジュールは、メモリストレージデバイスを含むローカルコンピュータ記憶媒体およびリモートコンピュータ記憶媒体の双方に配置することができる。
【0041】
ソフトウェアアーキテクチャーのコンテキストにおけるインターフェースは、コンピュータ実行可能命令のソフトウェアモジュール、コンポーネント、コード部分、あるいはその他のシーケンスを含む。このインターフェースは、例えば、第2のモジュールにアクセスする第1のモジュールを含み、この第2のモジュールは、第1のモジュールのためにコンピューティングタスクを実行する。第1のモジュールおよび第2のモジュールは、一例においては、オペレーティングシステムによって提供されるようなAPI(application programming interface)、(例えば、ピアツーピアのアプリケーション通信のための)COM(component object model)インターフェース、および(例えば、ウェブサービスどうしの間における通信のための)XMI(extensible markup language metadata interchange format)インターフェースを含む。
【0042】
このインターフェースは、J2EE(Java(登録商標) 2 Platform Enterprise Edition)、COMまたはDCOM(distributed COM)の例におけるような密結合の同期的な実装形態とすることができる。別法として、あるいは追加として、このインターフェースは、(例えばシンプルオブジェクトアクセスプロトコルを使用する)ウェブサービスにおけるような疎結合の非同期的な実装形態とすることもできる。一般に、このインターフェースは、密結合、疎結合、同期、および非同期という特性の任意の組合せを含む。さらに、このインターフェースは、標準的なプロトコル、独自のプロトコル、あるいは標準的なプロトコルと独自のプロトコルとの任意の組合せに準拠することができる。
【0043】
本明細書に記載されているインターフェースは、すべてを単一のインターフェースの一部とすることもでき、あるいは別々のインターフェースやそれらの任意の組合せとして実装することもできる。これらのインターフェースは、ローカルまたはリモートで実行して、機能を提供することができる。さらに、これらのインターフェースは、本明細書において例示または説明されている機能よりも多い機能を含むこともでき、あるいは少ない機能を含むこともできる。
【0044】
サーバ430は、作動中に、本発明の態様を実施するための、図に示されているようなコンピュータ実行可能命令を実行する。
【0045】
特段の指定がない限り、本明細書において例示および説明されている本発明の実施形態における動作を実行または実施する順序は、必須ではない。すなわち、これらの動作は、特段の指定がない限り、任意の順序で実施することができ、本発明の実施形態は、本明細書に開示されているよりも多くの動作を含むこともでき、あるいは少ない動作を含むこともできる。例えば特定の動作を、別の動作の前に、別の動作と同時に、あるいは別の動作の後に実行または実施することは、本発明の態様の範囲内に収まるものと考えられる。
【0046】
本発明の実施形態は、コンピュータ実行可能命令と共に実装することができる。それらのコンピュータ実行可能命令は、コンピュータによって実行可能な1つまたは複数のコンポーネントやモジュールへと編成することができる。本発明の態様は、任意の数および編成のそのようなコンポーネントやモジュールと共に実装することができる。例えば本発明の態様は、本明細書において図示および説明されている特定のコンピュータ実行可能命令や特定のコンポーネントまたはモジュールには限定されない。本発明のその他の実施形態は、本明細書において例示および説明されているよりも多くの機能または少ない機能を有する別のコンピュータ実行可能命令またはコンポーネントを含むことができる。
【0047】
本発明の態様やその実施形態の要素を紹介する際に、「a」、「an」、「the」、および「said」という冠詞は、それらの要素が1つまたは複数存在するということを意味することを意図している。「comprising」、「including」、および「having」という用語は、包括的な意味を意図しており、記載されている要素のほかにさらなる要素が存在しうるということを意味している。
【0048】
本発明の態様の範囲から逸脱することなく、上述の構造、製品、および方法に様々な変更を行うことができるため、上述の説明に含まれ、添付の図面に示されているすべての内容は、例示として解釈すべきであり、限定的な意味に解釈すべきではないということが意図されている。
【0049】
付録A
アウトバウンドバッチング:バッチャーコンポーネントは、バッチをカット(cut)するために、すなわちいつバッチが完成するかを判断するために使用されるロジックを含む。またバッチャーコンポーネントは、バッチ内でのメッセージの順序を決めるためなどに使用されるその他の任意のロジックをカプセル化している。メッセージングエンジンコンポーネントは、バッチャーコンポーネント、パイプライン、およびデータベースと対話する役割を果たすコードを含む。
【0050】
バッチャーコンポーネントは、下記のインターフェースを実装することができる。
【0051】
【表1】

【0052】
【表2】

【0053】
これらのインターフェースに示されているように、スタンダード(standard)およびハイパフォーマンス(high performance)という2つのタイプのバッチャーが存在することができる。
【0054】
スタンダードバッチャーは、メッセージングエンジンが、バッチャーの対話を伴わずにすべてのメッセージパーシスタンスを取り扱えるようにする。バッチャーのタイプは、Initialize()への呼び出しにおけるpropertyBagでメッセージングエンジンに返される。スタンダードバッチャーの場合には、メッセージングエンジンは、バッチが満たされるまでAddMessage()へのそれぞれの呼び出しの後にメッセージをインスタンス状態へ自動的にパーシストする。
【0055】
ハイパフォーマンスバッチャーは、純粋なメモリ内でのバッチングを行うことができ、メッセージをいつパーシストすべきかをメッセージングエンジンに伝える。これらのバッチャーの場合には、メッセージングエンジンは、AddMessage()へのそれぞれの呼び出しの後にメッセージをインスタンス状態へパーシストしない。その代わりに、このバッチャーは、メッセージをメモリ内に蓄積することができる。この方法では、バッチが満たされると、バッチャーは、メッセージングエンジン上でBatchComplete()を呼び出し、IBaseMessageSetを与えることができる。そしてメッセージングエンジンは、インスタンス状態からメッセージを読み取る必要なしに、パイプラインを直接実行することができる。これらのバッチャーは、メッセージをメモリ内に保持する設定されたしきい値を有することもできる。このバッチャーは、メッセージをディスクにフラッシュ/パーシストしたいときはいつでも、PersistMessages()APIを呼び出して、メッセージをディスクにフラッシュ/パーシストことができる。このバッチャーがPersistMessages()を呼び出すと、MessageIDを用いてBatchComplete()を呼び出すまではメモリ内のすべてのメッセージが必ずパーシストされるようになる。
【0056】
メッセージングエンジンの対話:
メッセージングエンジンは、バッチ処理の対象とされている送信ポートへ向かうメッセージを得ると、内部のハッシュテーブルを見ることによって、この送信ポート用にバッチャーコンポーネントが既に作成されているかどうかをチェックする。既に作成されているバッチャーコンポーネントがない場合には、メッセージングエンジンは、新たなバッチャーコンポーネントを作成し、そのバッチャーコンポーネント上でInitialize()を呼び出す。
【0057】
そしてエンジンは、そのメッセージ用のバッチャーコンポーネント上でAddMessage()を呼び出す。このバッチャーコンポーネントは、そのメッセージを見て、バッチが満たされているかどうかを判断する。バッチが満たされている場合には、このバッチャーコンポーネントは、エンジンをコールバックして(ICallback)、成功のバッチステータスを示す。バッチが満たされていない場合には、このバッチャーコンポーネントは、その内部状態を更新した後でAddMessage()から返る。
【0058】
スタンダードバッチャーの場合、AddMessageが返って、バッチが満たされていないときには、エンジンは、そのメッセージをインスタンス状態に書き込む。その一方で、バッチが完成している場合には、このバッチャーは、IMessageSetをメッセージングエンジンに返す。エンジンは、MessageIDListへのアクセスを試み、このMessageIDListは、メッセージのメッセージIDを正しい順序で有する(このリストに関しては、バッチャーによって任意の種類のソーティングが行われる)。MessageIDListが与えられると、エンジンは、メッセージを正しい順序でインスタンス状態から引き出すことを開始することができる。エンジンは、これらのドキュメントからメッセージセットを作成し、そしてパイプラインを実行するためのパイプラインマネージャーにこのメッセージセットを与える。
【0059】
ハイパフォーマンスバッチャーは、スタンダードバッチャーとは対照的に、ICallback上でPersistMessages()を定期的に呼び出して、メッセージをインスタンス状態へフラッシュする。このバッチに関してさらに多くのメッセージが着信した場合には、エンジンは、以前に作成されたバッチャーコンポーネント上でAddMessage()を呼び出す。コールバック(ICallback)は、AddMessage()から同期的に呼び出すこともでき、あるいはバッチャーコンポーネントによって非同期的に呼び出すこともできる。時間に基づいてバッチをカットしなければならない場合には、バッチャーコンポーネントは、そのバッチのためのウィンドウズ(登録商標)タイマを待つ。すなわち、タイムアウトが生じた場合には、エンジンをコールバックして、バッチが完成している旨をエンジンに告げる。バッチが完成している場合には、バッチャーは、IMessagesetをエンジンに返す。エンジンは、(スタンダードバッチャーの場合と同様に)まずMessageIDListへのアクセスを試みる。MessageIDListが空である場合には、エンジンは、MessageListを読み取ることを試みる。このMessageListは、バッチャーがメモリ内でのバッチングを行っている場合には、有効な値を有する。MessageListが存在する場合には、エンジンは、IBaseMessaegSetを作成し、パイプラインを実行する。
【0060】
パイプラインの実行:パイプラインマネージャー内のインターフェースによって、エンジンは、メッセージセットを実行用としてパイプラインに与えることができる。そしてパイプラインマネージャーは、メッセージセット内のすべてのメッセージのためにアセンブラ上でAddDocumentを呼び出し、次いでそれらのメッセージを組み立てる。
【0061】
独立メッセージバッチング:
メッセージングエンジンは、(独立バッチング用に構成されている)送信ポートのための最初のメッセージがエージェントから受信されると、ダミーのインスタンスを作成する。エンジンは、SendPortIDをバッチャーパイプラインポインタにマップするハッシュテーブルを保持する。任意の時点で、アクティブなバッチャーコンポーネントが1つ存在し、送信ポートへ向かういかなる新たなメッセージも、そのアクティブなバッチャーコンポーネントだけに送られる。その他のバッチャーコンポーネントは、例えばフェイルオーバのシナリオにおいては、非アクティブにすることができる。
【0062】
従属的メッセージバッチング:
従属的メッセージバッチングの場合には、下記のものが、送信ポート上に構成される。送信ポートは、従属的バッチを形成するために使用されるプロパティをユーザが選択することができるオプションを有する。例えば、選択されたメッセージコンテキストプロパティがBTS.BatchIDである場合には、その送信ポート用にコンボイサブスクリプション(convoy subscription)が作成される。それぞれのメッセージは、(a)コンボイ用に使用されるプロパティ(BTS.BatchID)、(b)バッチャーによって使用されるBTS.BatchEnd=true/false、(c)やはりバッチャーによって使用されるBTS.BatchStart=true/falseという特別なメッセージコンテキストプロパティのうちの少なくとも2つを有する。プロパティ(b)および(c)は、Batcherプロパティページ内に構成され、送信ポートプロパティ内には現れない。
【0063】
メッセージの作成元(ワークフロースケジュールやパイプラインサービス)は、自分がこの送信ポート用に発行しているそれぞれのメッセージごとにBTS.BatchIDをプロモート(promote)する。同じBTS.BatchIDを有するメッセージどうしは、バッチにまとめるために送信ポートの同じインスタンスへ送信される。メッセージの作成元は、いつバッチが完成するかを把握し、BTS.BatchEndを書き込むことになる。
【0064】
新たなバッチを開始するために、メッセージの発行者は、(一意の)BTS.BatchIDをプロモートし、メッセージを発行する。コンボイテーブル(convoy Table)をチェックした後に、メッセージボックスによって新たなインスタンスが作成される。
【0065】
同じBTS.BatchIDを有する後続のメッセージは、メッセージボックスによって同じインスタンス上に送達される。これらのメッセージがメッセージングエンジンに送達される際には、メッセージングエンジンは、それらのメッセージが、従属的メッセージバッチ(送信ポートの構成)であることを既に知っている。エンジンは、BTS.BatchIDを正しいバッチャーポインタにハッシュする。
【0066】
バッチャーは、従属的バッチのために次のことを実行することができる。(a)バッチャーは、BTS.BatchEndプロパティを見て、いつバッチをカットするかを判断する。(b)バッチャーは、障害の場合、例えばユーザがタイムアウトを有することを望む場合を取り扱う。(c)バッチャーは、メッセージをソートする。
【0067】
エンジンは、上述のようにスタンダードバッチャーかハイパフォーマンスバッチャーかに応じてメッセージを現在のインスタンスのインスタンス状態に書き込むことができる。
【0068】
バッチが完成すると、エンジンは、アセンブラを実行し、メッセージを送信する。組み立てられたメッセージが首尾よく送信されると(deleteMessage())、フレームワークインスタンスは、コンボイに応じて作成されたインスタンスを完了する。retries/movetonextTransport/catastrophic failureなど、その他のすべての点については、独立メッセージバッチングと同様である。
【0069】
インスタンス状態との間における読み出しおよび書き込み:
メッセージがインスタンス状態に書き込まれる際には、フレームワークは、まずmessageIDをインスタンスストリームに書き込む。そして、エージェントAPI AddMessageObject()を呼び出す。
【0070】
また、メッセージをインスタンス状態に書き込んでいるときに、フレームワークは、同じトランザクション内でComplete() the original messageを受け取って、オリジナルメッセージをApplicationQから削除する。
【0071】
インスタンス状態からメッセージを読み出すために、フレームワークは、messageIDを使用する。すなわちフレームワークは、まずインスタンスストリームを読み取ってmessageIDを入手し、次いでそれらのmessageIDを使用してメッセージを入手する。messageIDによってメッセージを引き出すステップは、順序も保持する。
【0072】
インスタンスのフェイルオーバ:
プロセスが何らかの壊滅的な障害のために機能しなくなった場合には、メッセージボックスは、次にそのプロセスが復活したあたりでダミーのメッセージを作成する。メッセージングエンジンは、このダミーのメッセージを受信し、このメッセージが、バッチ処理の対象とされている送信ポートに対応していることを識別することができる。すなわち、そのインスタンスに関する最初のメッセージについてインスタンス状態に書き込みを行う前に、メッセージングエンジンは、送信先のSendPortIDおよびその他の関連する情報をインスタンス状態ストリームに書き込む。
【0073】
送信ポートが、独立メッセージバッチ用に構成されている場合には、あるインスタンスがフェイルオーバすると、そのインスタンスは、使用中のアクティブなバッチャーを既に有しているメッセージングエンジンインスタンスに返すことができる。したがって、生きている/ダミーのメッセージがメッセージングエンジンによって受信されると、メッセージングエンジンは、同じスレッド内でインスタンス状態の中に保存されているバッチ全体を空にする。メッセージングエンジンは、新たなバッチャーオブジェクトを作成し、そのバッチャーオブジェクトを初期化する。メッセージングエンジンによってバッチャーに渡されるpropertybagは、これが、フェイルオーバされたインスタンスであるということを示す。また、可能な場合には、メッセージングエンジンは、バッチ内のメッセージの数も提供する。そしてメッセージングエンジンは、インスタンス状態からすべてのメッセージを読み出し、バッチャー上でAddMessage()を呼び出す。バッチャーは、最後のメッセージを受信すると、メッセージングエンジン上でBatchComplete()を呼び出す。
【0074】
バッチャーがどのように構成されているかに応じて、バッチを合格または不合格にすることができる。バッチが不合格にされた場合には、メッセージングエンジンは、そのバッチ内のすべてのメッセージを一時停止する。
【0075】
送信移送機能:
伝送の成功:アダプタは、パイプラインから来たメッセージ上でDeleteMessage()を呼び出す。Qからのメッセージは、completed()を既に受け取られているため、InstanceState内のメッセージは削除される。インスタンス状態からメッセージを削除するために、フレームワークは、エージェントAPI ReleaseMessage()を呼び出す。
【0076】
再送信:Qからのメッセージは、completed()を既に受け取られているため、フレームワークは、InstanceState内にあるメッセージの再送を試みる。再試行間隔の後に戻るタイマメッセージが通知される。メッセージングエンジンがそのタイマメッセージを見ると、インスタンス状態からメッセージを読み出すステップが再始動し、処理が再開する。再び、messageIDがインスタンスストリームから順に読み出され、そしてメッセージがインスタンス状態から引き出される。
【0077】
MoveToNextTransport:メッセージングエンジンは、メッセージをインスタンスに通知する。このメッセージのバックアップになると、メッセージングエンジンは、このメッセージがバックアップトランスポート(backup transport)に移動されてきていることを認識し、インスタンス状態からメッセージを排出しようと試み、バッチを処理する。
【0078】
SuspendMessage:InstanceStateの内部のメッセージは、インスタンス状態から引き出され、SuspendMessages(MessageId[])APIを使用して一時停止され、そのSuspendMessages(MessageId[])APIは、これらのメッセージをインスタンス状態からsuspendQに移動させる。あるいは、メッセージをダミーのインスタンスに通知して、そのダミーのインスタンスを一時停止することもできる。メッセージが再開されると、インスタンス状態は空にされる。
【0079】
バッチ処理の対象とされている送信ポートはまた、順序付けられた送達のためにマークされる:これが行われる際には、メッセージングエンジンは、独立したバッチの場合でさえ、その送信ポートのためのダミーのインスタンスを作成しない。メッセージングエンジンは、その順序付けられた送信ポートのためのデフォルトのインスタンスに対応するインスタンス状態を自動的に使用する。エージェント送達スレッド(agent delivery thread)を断念する前に、メッセージングエンジンは、そのメッセージが送信されたかまたは失敗したかをアダプタが確認できるようにブロックを行う(バッチ上でのコールバック)という事実において、動作がわずかに変化するかもしれない。
【0080】
トラッキング:送信パイプラインへの入力メッセージと、出力メッセージとの間にリンクを保持することができる。あるメッセージがapplicationQからインスタンス状態へ移動されると、そのメッセージ上でReceiveComplete()を呼び出すと、そのメッセージは、applicationQから削除される。これが行われる際のHATにおけるステータスは、メッセージが完全に処理される際に示されるステータスとは区別することができる(すなわち、DeleteMessage()−がReceiveComplete()に変わる)。
【図面の簡単な説明】
【0081】
【図1】従来技術による構造化されたメッセージのコンピュータどうしでのやり取りを示す流れ図である。
【図2】本発明の一実施形態によるメッセージ集約のためのコンピューティングシステム環境を示すブロック図である。
【図3】本発明の一実施形態によるメッセージ集約を示す例示的な流れ図である。
【図4】本発明を実装することができる適切なコンピューティングシステム環境の一例を示すブロック図である。

【特許請求の範囲】
【請求項1】
メッセージを集約するコンピュータ化された方法であって、
少なくとも1つのアプリケーション(202)から複数のメッセージを受信するステップ(302)と、
前記受信したメッセージ上でバッチ構成ポリシーを実行するステップ(306)と、
前記受信したメッセージを前記バッチ構成ポリシーに関して1つのバッチ内に集約するステップ(310)と、
単一のストリームメッセージ出力の中に前記バッチを組み立てるステップ(316)とを含むことを特徴とする方法。
【請求項2】
前記単一のストリームメッセージ出力は、1つのエンドポイント(408)に宛てられていることを特徴とする請求項1に記載の方法。
【請求項3】
前記実行するステップは、前記バッチに関連付けられているインスタンス状態(402)を保持するステップをさらに含むことを特徴とする請求項1に記載の方法。
【請求項4】
前記インスタンス状態(402)をデータストア(108)内に保存するステップをさらに含むことを特徴とする請求項3に記載の方法。
【請求項5】
前記受信するステップ、実行するステップ、および保持するステップは、第1のコンピュータに関連付けられており、前記データストア(108)は、第2のコンピュータに関連付けられていることを特徴とする請求項4に記載の方法。
【請求項6】
前記受信するステップは、前記受信したメッセージ(404)をデータストア(108)内に保存するステップをさらに含むことを特徴とする請求項1に記載の方法。
【請求項7】
前記バッチ構成ポリシーは、前記アプリケーション(102)のための前記メッセージをバッチにまとめるためのビジネスロジックを含むことを特徴とする請求項1に記載の方法。
【請求項8】
前記ビジネスロジックは、前記バッチ内での前記メッセージのソート順序、前記バッチ内のメッセージの数、前記バッチ内の累積バイト数、前記バッチ内のメッセージの1つまたは複数のタイプ、およびメッセージを蓄積するための時間というポリシーパラメータのうちの少なくとも1つを含むことを特徴とする請求項7に記載の方法。
【請求項9】
前記集約するステップは、前記構成ポリシーに関して前記メッセージをソートするステップをさらに含むことを特徴とする請求項1に記載の方法。
【請求項10】
前記メッセージは、EDI(Electronic Data Interchange)標準に準拠することを特徴とする請求項1に記載の方法。
【請求項11】
1つまたは複数のコンピュータ可読媒体が、請求項1に記載の方法を実行するためのコンピュータ実行可能命令を有することを特徴とする請求項1に記載の方法。
【請求項12】
メッセージを集約するコンピュータ化された方法において、
少なくとも1つのアプリケーションから複数のメッセージを受信するステップ(302)であって、前記メッセージは、バッチ識別子およびバッチ終了インジケータを含むステップと、
前記受信したメッセージを前記バッチ識別子に関して1つのバッチ内に集約するステップ(308)と、
前記バッチ終了インジケータに関して前記集約するステップを完了するステップ(310)と、
単一のストリームメッセージ出力の中に前記バッチを組み立てるステップ(316)とを含むことを特徴とする方法。
【請求項13】
前記メッセージを集約するためのバッチャーの前記インスタンスを特定するために前記バッチ識別子をハッシュするステップをさらに含むことを特徴とする請求項12に記載の方法。
【請求項14】
前記バッチ完成インジケータは、前記バッチが完成するときに知らせることを特徴とする請求項12に記載の方法。
【請求項15】
前記単一のストリームメッセージ出力は、1つのエンドポイントに宛てられていることを特徴とする請求項12に記載の方法。
【請求項16】
前記バッチに関連付けられているインスタンス状態(402)を保持するステップをさらに含むことを特徴とする請求項12に記載の方法。
【請求項17】
前記インスタンス状態(402)をデータストア(108)内に保存するステップをさらに含むことを特徴とする請求項16に記載の方法。
【請求項18】
1つまたは複数のコンピュータ可読媒体が、請求項12に記載の方法を実行するためのコンピュータ実行可能命令を有することを特徴とする請求項12に記載の方法。
【請求項19】
アプリケーション(102)のためのメッセージを集約するためのシステムにおいて、前記メッセージは送信ポートに宛てられているシステムであって、
前記アプリケーションからメッセージを受信するためのメッセージエンジンコンポーネント(104)と、
前記アプリケーションのための前記メッセージをバッチにまとめるためのビジネスロジックを含むバッチ構成ポリシー(106)と、
メッセージを前記バッチ構成ポリシー(106)に関して1つのバッチへと集約するためのバッチャーコンポーネント(106)において、前記送信ポートに関連付けられているバッチャーコンポーネント(106)であって、前記送信ポートに宛てられているメッセージを前記メッセージエンジン(104)から受信するバッチャーコンポーネント(106)とを含む、コンピュータによって実行可能な1つまたは複数のコンポーネントを含み、
前記メッセージエンジンコンポーネント(104)は、前記送信ポートに関連付けられている前記バッチャーコンポーネント(106)が存在しない場合には、前記送信ポートに関連付けられている前記バッチャー(106)の新たなインスタンスを作成することを特徴とするシステム。
【請求項20】
前記メッセージエンジンコンポーネント(104)は、第1のコンピュータに関連付けられており、第2のコンピュータに関連付けられているデータストア内に保存されている前記バッチのインスタンス状態(402)を保持し、前記インスタンス状態(402)は、メッセージ識別子および送信ポート識別子を含み、
前記メッセージエンジンコンポーネント(102)は、第1のコンピュータに関連付けられており、前記メッセージを、前記第2のコンピュータに関連付けられている前記データストア(108)内に保存することを特徴とする請求項19に記載のシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate


【公表番号】特表2009−532803(P2009−532803A)
【公表日】平成21年9月10日(2009.9.10)
【国際特許分類】
【出願番号】特願2009−504188(P2009−504188)
【出願日】平成19年3月8日(2007.3.8)
【国際出願番号】PCT/US2007/005765
【国際公開番号】WO2007/120410
【国際公開日】平成19年10月25日(2007.10.25)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.EEPROM
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】