HelloWorld オーケストレーション (開発編)
こんにちは。BizTalk Server サポートチームの村岡達也です。
BizTalk Server の SDK には、多くのサンプルが含まれていることをご存じでしょうか。今回はBizTalk アプリケーションにはじめて触れる方を対象に、HelloWorld オーケストレーションサンプルを解説します。
(※BizTalk Server が正しくインストールされていることが前提となりますので、あらかじめセットアップは完了させておいてください)
MSDN にも、同じ SDK サンプルの利用方法のドキュメントがありますので、あわせて目を通してみてください。
https://msdn.microsoft.com/ja-jp/library/aa559831.aspx
とりあえず動かしてみたいという方はコチラを先にご覧ください ⇒ HelloWorldオーケストレーション (動作確認編)
◆プロジェクトを Visual Studio で開いてみる
HelloWorld サンプルは、受信したメッセージをオーケストレーション内で別のメッセージに変換してから、送信するという単純な内容となっています。
以下の手順で HelloWorld プロジェクトを Visual Studio で開いて内容を確認してみます。念のためHelloWorld フォルダはバックアップを取っておいてください。
SDK\Samples\Orchestrations\HelloWorld フォルダ内のHelloWorld.sln を開きます。
Visual Studio のソリューションエクスプローラーに表示されているのが、本サンプルに含まれるリソースです。
- HelloOrchestation.odx -- オーケス トレーション
- InvoiceSchema.xsd / POSchema.xsd --スキーマ
- POToInvoice.btm -- マップ
- HelloWorld.snk -- キーファイル (厳密名の署名に使われています)
このオーケストレーションでは PO と Invoice という 2 種類のメッセージを扱いますので、メッセージ形式を定義するスキーマも 2 つあります。
これらの xsd ファイルを開いてみるとスキーマエディタが起動して、メッセージのデータ構造とそれに対応する XML 記述を確認できます。XML を直接編集しなくとも、左側ツリーの操作で新しいフィールド要素を追加したり、プロパティウィンドウでデータ型などを設定できます。
◆オーケストレーション (odx)
HelloOrchestration.odx を開いてみます。オーケストレーションデザイナーが起動して、HelloOrchestration の実装が表示されます。
ReceivePOPort からReceivePO 受信図形への線がメッセージの受信を、SendInvoice 図形から SendInvoicePort への線がメッセージの送信をあらわします。
真ん中にあるConstructInvoice 図形がこのオーケストレーションのポイントとなる [変換] 図形を使用したメッセージの変換・構築となっています。
サンプルではすでに接続状態になっていますが、ポートと受信 (送信) 図形を結びつける操作を確認してみます。ReceivePOPort から伸びる線を Delete キーで消したあと、もう一度引き直してみてください。ポート図形にある緑の矢印、または受信図形のコネクタをマウスでドラッグして目的のところまで引っ張っていきます。
続いて、受信図形 ReceivePO のプロパティを確認してみると「アクティブ化」が True になっていることが分かります。
オーケストレーションは「アクティブ化」が指定されたメッセージの受信を契機として開始します。もし「アクティブ化」が指定されている受信図形がひとつも含まれていないと、そのオーケストレーションは開始するきっかけがありません。
受信メッセージをきっかけに処理を開始するオーケストレーションは、常にアクティブ化が True の受信図形で始まることを覚えておいてください。(他の開始パターンもあるのですが、それは別の機会にご紹介します)
また、プロパティ中の「メッセージ」の項目では、この受信図形はPOMessage メッセージに対応していることが分かります (送信は InvoiceMessage )。
送受信図形は、このように BizTalk プロジェクト内で定義されている「メッセージ」を参照することも必要になります。
続いてメッセージの定義をみていきます。ソリューションエクスプローラーの表示を下のタブから切り替えて [オーケストレーションの種類] を選択すると、プロジェクトに含まれているメッセージを確認できます。
メッセージ「InvoiceMessage」のプロパティを表示すると、[メッセージの種類] に Microsoft.Samples.BizTalk.HelloWorld.InvoiceMessageType が選択されていることが分かります。
Microsoft.Samples.BizTalk.HelloWorld.InvoiceMessageType というのは、スキーマ InvoiceSchema.xsd で定義されたメッセージ形式であるということです。
メッセージの種類のプルダウンを展開すると、同じプロジェクトに含まれているスキーマが一覧から選択できることが分かります。
つまり「スキーマ」でデータの構造を定義して、そのスキーマに従った「メッセージ」をプロジェクト内に作成して、「送受信図形」のプロパティにメッセージを設定する、という関係になっています。
◆マッパー (btm)
再びオーケストレーションに戻って、中央の ConstructInvoice 図形をみてみます。
[メッセージの構築] 図形の中には、[変換] 図形が含まれています。[変換] 図形では受信したメッセージ (PO) から送信メッセージ (Invoice) を作成する処理が実装されています。[変換] 図形の POToInvoiceTransform をダブルクリックして処理内容を確認します。
「変換の構成」ウィンドウが開いて、送信元が POMessage、送信先が InvoiceMessage になっていることが確認できます。
「Biztalk マッパーを起動する」のチェックをいれて [OK] で起動します。またはソリューションエクスプローラーの POToInvoice.btm ファイルを直接開くこともできます。
次のように BizTalk マッパー編集画面が起動して、受信した PO メッセージに含まれるデータを Invoice に対応させていることが分かります。
(とはいえ、このサンプルでは PO と Invoice が全く同じ形式ですので、フィールド名が違うだけで、単にデータを 1 対 1 で対応させているだけです)
ちなみにマッパーでは、単にデータ同士を結ぶだけでなく、ツールボックスから functoid と呼ばれる図形を追加して、数値演算や文字列処理なども可能です。現実の業務データを扱うときは、マップが非常に複雑になってくることは容易に想像できることと思います。
◆ポートとバインド
最後にポートの構成を確認してみます。オーケストレーションに戻って、[ReceivePOPort]ポート図形をダブルクリックすると、[ポート構成ウィザード] が立ち上がります。
[ポートのプロパティ] > [ポートの種類の選択] > [ポートのバインド] の順に進めて、サンプルに設定されている内容を確認してみてください。
ポートでは通信方式 (一方向 or 要求/応答) と通信方向 (送信 or 受信)、どの場所 (URI) から、どのような方法で (トランスポート) メッセージが送受信されるのかを決定します。
そのうち「場所と方法」を決めている情報を「バインド」情報と呼びます。バインド情報はアプリケーションから完全に独立させることができ、プロジェクト内のポートの設定では指定せず、今回の HelloWorld サンプルのようにあとから BizTalk 管理コンソール上で指定することができます。
つまりアプリケーション内では、あらかじめ通信方式と方向さえ決めておけば、あとはどのようにメッセージを送受信するのかは意識しなくても良いということになります。
例えばファイルシステムの共有フォルダや FTP からメッセージを取り込んでも良いですし、そのあと作成したメッセージを HTTP やメールの SMTP で送信することもできます。SQL Server データベースや、SAP や Oracle などの外部基幹システムと接続できるアダプターを通じて、メッセージを送受信することも可能です。
なお、今回の HelloWorld サンプルで「後で指定する」となっているバインド情報は、サンプルと同梱の HelloWorldBinding.xml ファイルで別で定義されていて、受信・送信ともにローカルのフォルダが構成されています。
以上で一通り、BizTalk アプリケーションの構成と、ポイントになる要素を確認しました。
今回のまとめです。
・BizTalk プロジェクトで取り扱うメッセージは、スキーマ (xsd) で定義される
・オーケストレーション odx にアプリケーションの実装ロジックが含まれる
・オーケストレーションを開始するための受信図形には「アクティブ化」を設定する。
・マッパー (btm) ではメッセージの変換ができる。
・ポートのバインド情報はプロジェクトに含めずに、後から指定することもできる。
次回は実際にサンプルの動作確認を行ってみます。
ではまた。