Uncategorized

【SOA における WCF の役割 (5)】 BizTalk Server からの LOB Adapter の使用 – schema 編

環境:
.NET Framework 3.0
BizTalk Server 2006 R2
Visual Studio 2005
WCF LOB Adapter SDK
BizTalk LOB Adapter Pack (※現在、Beta 版を使用可能です)
Oracle 10 g Express Edition
Oracle Data Access Components (ODAC) 2.0

  1. WCF と BizTalk、そして LOB Adapter
  2. WCF における Binding と Channel の基礎
  3. WCF LOB Adapter SDK によるカスタムアダプター実装
  4. WCF からの LOB Adapter の使用
  5. BizTalk Server からの LOB Adapter の使用 – schema 編
  6. BizTalk Server からの LOB Adapter の使用 – orchestration 編
  7. BizTalk Server からの LOB Adapter の使用 – deploy 編

こんにちは。

今回は、前回までに作成したアダプターを BizTalk Server から使用して動きを確認してみます。

前回までに作成したサンプルだと inbound の処理があまりにもプアーでしたので、今回は、前回作成した Custom Adapter (CustomAdapter1) に加え、BizTalk Adapter Pack に入っている Oracle Adapter の inbound 処理を使用したサンプルにしてみましょう。(やや長くなるので、3 回にわけます。あとで修正があるかもしれませんが、その際はあとで注記しておきます、、、)

構築するサンプル

  1. BizTalk Adapter Pack の Oracle 用アダプタを使用して、注文テーブル (testorder テーブル) に行が追加されたら BizTalk の処理を開始するようにしてみます (inbound senario)。
    処理したデータはあとから処理済みか否か区別が付くように専用の History テーブル (testorderhistory テーブル) に保存しておくことにします。
  2. 取得したデータ一式 (更新されたデータ一式) から 1 レコードずつを取り出し、以下の処理をおこないます。(ここは少し面倒な処理になると思います。)
  • 前回作成した CustomAdapter1 を使用して、「商品名」を繰り返し文字列に変換してみます (EchoTimes オペレーションを呼び出します)。
  • そして、その変換後の結果 (XML) をファイルに出力します。

実際の開発では「SharePoint でドキュメントが承認されたら、SAP に経費申請を登録」などいろいろと応用できますが、このサンプルでは、例によってサンプルを簡単に (かつエッセンスを紹介) するためのデモとしたいので、非常に「無意味な」ビジネスの処理をおこなっていますがご了承ください。

また環境構築では Oracle Adapter を使用しますので、Oracle の対応バージョンや必要コンポーネントにも注意してください。(これらの情報はインストールガイドに記載されています。特に ODAC の 2.0 ベースのアセンブリが必要になりますので ORACLE 社より入手してください。ただしくインストールできない場合には、GAC に Oracle.DataAccess.dll と Oracle.DataAccess.resources.dll をコピーするなどしてください。)

予備知識

さて、このサンプルでは 3 つのアダプターが登場します (BizTalk Adapter Pack の Oracle Adapter, カスタムの CustomAdapter1, そして FILE アダプターです)。これらのアダプターを使用する前に、第1回でも触れた BizTalk のアダプターフレームワークについて簡単に整理をしておきます。

まず、第1回でもご説明したように、BizTalk にはもともと「Adapter」と呼ばれるオブジェクトが存在し、ここで、ファイル、メール (SMTP)、SAP、SharePoint (WSS3.0 や MOSS)、などさまざまなプロトコルへの依存性を吸収する仕組みがもともと備わっていました。
これが、WCF の登場によって、この WCF と接続するための「WCF Adapter」という形で拡張され、さらに第2回でもご説明したようにカスタマイズ性に優れたこの WCF のフレームワークをそのままアダプターに代わって使用できるように、今回ご紹介している WCF LOB Adapter SDK なるものが登場し、今まで敷居の高かったアダプター開発がより敷居の低い方法で開発できるようになりました。

以下に、こうしたアダプター構成の関係を図示しておきます。

上図のように、WCF LOB Adapter SDK で作ったアダプター (BizTalk Adapter Pack のアダプターを含む) は、もともと BizTalk に備わっていた WCF-Custom アダプターの上で動作するということをおぼえておいてください (実際に設定の際に必要になる知識です)。

また、BizTalk によるプロジェクト構築ではアダプター設定をおこなうだけではありません。以下に、BizTalk にはじめて触れる方のために、BizTalk によるプロジェクト構築の流れを簡単に記載しておきます。(チュートリアル : http://msdn2.microsoft.com/ja-jp/library/aa560270.aspx)

  1. BizTalk 内部で扱う中立的な (システムに依存しない) 交換用データとして「メッセージ」(Message) と呼ばれるものを使用します。通常、メッセージは XML 形式となっていて (シリアライズ可能な .NET のクラスを使うこともできます)、この XML 形式のメッセージのデータ構造を定義するため、作成する「メッセージ」に対応したスキーマ定義 (xsd ファイル) を作成する必要があります。中立性を維持するベストプラクティスとして、接続するアダプターに “非依存なメッセージ” 構造を採用する (受信、送信時は、受信マップ、送信マップを使って変換できます) という方法がベストですが、今回はサンプルですので Oracle Adapter から返ってくるメッセージのスキーマ定義と、CustomAdapter1 に渡すメッセージのスキーマ定義をそのまま使用することにします。
  2. このメッセージを使って、BizTalk 内のプロセス (オーケストレーション) を組み立てていきます。このオーケストレーションの中で、アダプターからの送受信 (Send, Receive) は勿論のこと、演算処理や、分岐などのいわゆるフローを組み立てていきます。
  3. 最後に、ビルドと配置をおこないます。
    配置後にオーケストレーション内部で作成した論理的な受信ポート、送信ポートと、実際のアダプターとの関連付けを設定します。(つまり、物理的な外部との接続は、オーケストレーションとわけて管理することができます。)

ということで要旨を押さえたところで、早速構築をおこなっていきましょう。

データベース (Oracle) の準備

今回は Oracle の所定のテーブルが変更されたら起動するわけですから、Oracle 内部にユーザ (スキーマ) やテーブルを構築する必要があります。

今回は、以下のようなテーブルを準備しておくことにしましょう。

  • テーブル : testorder
    ここにデータが登録されたら、BizTalk のオーケストレーションのインスタンスを開始します。
    カラムとして ID と NAME を持たせておきます。
  • テーブル : testorderhistory
    testorder で処理したデータ (処理後のデータ) は、この history テーブルに保管することにします。つまり、ここに保管されていないデータが testorder に登録されたら、Oracle Adapter を介して BizTalk のインスタンスが開始されることになります。
  • ストアドプロシジャー : testpkg.postpoll_action
    処理開始後に testorder で処理済みのデータを testorderhistory に入れるためのプロシージャです。

スクリプトは、以下のようになるでしょう。

CONNECT testuser1/Passw0rd

CREATE TABLE testorder (id integer, name varchar2(255), constraint pk_testorder primary key(id));
CREATE TABLE testorderhistory (id integer, constraint pk_testprocorder primary key(id));

CREATE OR REPLACE PACKAGE testpkg AS
  PROCEDURE postpoll_action;
END testpkg;
/
CREATE OR REPLACE PACKAGE BODY testpkg AS
 PROCEDURE postpoll_action IS
 currentrec testorder%ROWTYPE;
 CURSOR recs is SELECT * FROM testorder WHERE id NOT IN (SELECT id FROM testorderhistory) FOR UPDATE;
 BEGIN
  OPEN recs;
  LOOP
   FETCH recs INTO currentrec;
   EXIT WHEN recs%NOTFOUND;
   INSERT INTO testorderhistory VALUES (currentrec.id);
  END LOOP;
 END;
END testpkg;
/

BizTalk プロジェクトの構築 (スキーマの作成)

では、BizTalk を使用して上述のサンプルのビジネスを構築していきましょう。

  1. Visual Studio 2005 を開いて [空の BizTalk Server] プロジェクトを新規作成します。
    (以降では、プロジェクト名を「IntegrationSample」とします。)
  2. 上述したように、メッセージ用の xsd スキーマを作成する必要があります。まずは Oracle Adapter からの結果を受け取るメッセージです。
    ソリューションエクスプローラでプロジェクトを右クリックして、[追加] – [生成した項目の追加] で [Consume Adapter Service] を選択します。
  3. すると、前回、WCF から Adapter に接続したときに使用したのと同様の画面 (Comsume Adapter Service Add-in, 下図) が表示されますので、ここに Oracle Adapter 接続用の設定をおこなっていきます。(すみません、下図は既に設定済みの図です。。。)
  4. まず、上図で binding として「oracleDBBinding」を選択して [Configure] ボタンを押し、表示される画面で以下を設定します。
  • [URI Properties] の [DataSourceName] として、接続する Oracle のデータソース名を指定します。これを指定すると、URI は「OracleDb://<data source name>」となります。
    (<data source name> は、oracle クライアントの tnsnames.ora で事前に設定しておいてください
  • [URI Properties] の [PollingId] プロパティは今回ブランクで構いません。
    皆さんの開発に備え、念のためここの意味を説明しておきます。BizTalk では、アダプターで指定する URI を一意にする必要があるのですが、PollingId を指定すると URI が「OracleDb://<data source name>?pollingid=<pollingid>」となるため、通常はここを指定して一意にします。(尚、PollingId を指定すると名前空間なども POLLINGSTMT でなく POLLINGSTMT<PollingId> となりますので、以降では xsd の中身を見て都度設定を変更してください。
  • [Security] として、[Client credential type] を「Username」に設定し、[User name] / [Password] には Oracle データベースのログイン ID / パスワードを設定します。(ここで一点注意ですが、ID / パスワードの文字列はすべて大文字としておきましょう。)
  • [Binding Properties] として、以下の 3 つを設定してください。(いろいろカスタマイズできるようになっているのですがとりあえず今回はこの 3 つで結構です)PollingInterval : 30

    ポーリングする間隔(秒)です。実は今回ここを指定しても意味ないのですが (今後設定するであろう物理ポートの設定だけで充分です)、作成する xsd スキーマに影響する可能性を考え、設定すべきものは必ず指定しておくようにしましょう。

    PollingStatement : SELECT * FROM TESTORDER WHERE ID NOT IN (SELECT ID FROM TESTORDERHISTORY) FOR UPDATE

    変更データを取り出すための SQL です。下図の [TransactionIsolationLevel] がデフォルトで ReadCommited になっていますが、この取り出しとつぎの [PostPollStatement] の処理の間でアトミックトランザクションを作成してデータの一貫性を持たせたいので、select … for update 文 (SQL Server でいうところの select … with (rowlock, xlock) です) を指定します。

    PostPollStatement : BEGIN TESTPKG.POSTPOLL_ACTION(); END;

    上記の [PollingStatement] で更新データを取得した “後” に呼び出される SQL です。今回は、上記で作成しておいたストアドプロシジャを呼び出すようにしました。

  • 上記の設定をすべておこなって [Connect] ボタンを押すと、データベースへの接続などおこなって使用可能なオペレーションが表示されます。
    ここで、inbound オペレーションとして POLLINGSTMT を選択して確定しましょう。(下図)
  • すると、Visual Studio のプロジェクトに、下図の通り OracleDBBindingSchema.xsd というスキーマが自動生成されます。これが、先ほど説明した Adapter からのデータを受け取るスキーマ (メッセージが使用するスキーマ定義) になります。
    下図のように、データベース内の定義を取得して、取得される TESTORDER テーブルの ID, NAME のカラムの要素が自動的にスキーマに設定されます。
  • 上記と同様の方法で、CustomAdapter1 の EchoTimes オペレーションのためのスキーマを追加します (こんどは binding として、第3回「WCF LOB Adapter SDK によるカスタムアダプター実装」 の際 に machine.config に登録した myCustomBinding1 を選択します。また、3 回 echo をしたいので、[Binding Properties] の「Count」を 3 に設定しておきます。)

    すると、同様に、CustomAdapter1BindingSchema.xsd が、Visual Studio のプロジェクトに追加されます。

ちょっと長くなってきましたので、今日はここでおひらきにしましょう。

上記で作成された xsd ファイルの中身の詳細はここでは割愛しますが、この設定によって、Oracle 側から WCF を介して、以下の形式の XML で答えが返ってきて、さらに、以下の形式の XML で CustomAdapter1 に渡す必要がある、という点をおぼえておいてください。(次回、このスキーマ構成を使って構築していくことになります)

[Oracle から返ってくる XML (例)]

<?xml version="1.0" encoding="utf-8" ?> 
<POLLINGSTMT xmlns="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMT">
  <POLLINGSTMTRECORD>
    <POLLINGSTMTRECORD>
       <ID>1</ID> 
       <NAME>テストデータ1</NAME>
    </POLLINGSTMTRECORD>
    <POLLINGSTMTRECORD>
       <ID>2</ID> 
       <NAME>テストデータ2</NAME>
    </POLLINGSTMTRECORD>
  </POLLINGSTMTRECORD>
</POLLINGSTMT>

[CustomAdapter1 に渡す XML (例)]

<?xml version="1.0" encoding="utf-8" ?> 
<EchoTimes xmlns="myscheme://myadapter">
  <param>テストデータ</param> 
</EchoTimes>

次回はオーケストレーション (orchestration) を作成して、いよいよ実行して動かしてみたいと思います。

Categories: Uncategorized

Tagged as:

9 replies »

Leave a Reply