Uncategorized

【SOA における WCF の役割 (4)】 WCF からの LOB Adapter の使用

環境:
Visual Studio 2005
.NET Framework 3.0
WCF LOB Adapter SDK 

  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 編 

こんにちは。 

今回は、前回作成したカスタムの WCF LOB Adapter を WCF から使用してみることで、その基本的な動作を解剖してみましょう。

outbound オペレーションの利用

まず、前回作成した超簡単な outbound オペレーション「EchoTimes」 (← 週が明けてよくよく見てみると変な名前です、、、) を使用してみましょう。

  1. Visual Studio で[コンソールアプリケーション] を新規作成します。
  2. 前回もご紹介しましたが、.NET 3.0 Adapter Framework では、アダプター実行のためのランタイム以外に、アダプターを使用するための専用の仕組みも組み込まれます。
    表示された Visual Studio のプロジェクトで、[Add Adapter Service Reference] を選択することで、Adapter のスケルトンを生成することができます。

  3. 前回もご紹介したアダプター参照の設定画面が表示されます (既に URI が設定済みになってしまっていますが、下図です)。

    この画面の左上のドロップダウンから先週登録した [MyCustomBinding1] を選択し、右の [Configure] ボタンを押します。
    すると、実装したカスタム Adapter に設定されている「hostname」や「Count」が以下のように設定可能になっています。

    ここで、「Count」を「3」に設定して確定します。

    すると、上図 (一番最初に掲載したアダプター参照の設定画面) のように、ここで入力した値に応じて URI 文字列がテキストボックスに自動設定されます。(「Count」については URI ではなく .config のほうに反映されます。これについては後述します。)

  4. ここまでの入力が完了したら、上図のアダプター参照の設定画面で真ん中より少し上にある [Connect] ボタンを押すと、アダプターのアセンブリに接続に行き、以下のように下部の設定ができるようになります。

    この画面の [Select contract type] 欄で「Client (outbound operations)」を選択すると上図のように先日実装した outbound オペレーション「EchoTimes」が表示され、「Service (inbound operations)」を選択すると前回作成した inbound operation である「DoSomeWork」が表示されます。
    また、前回 Browse 用のコードで記載した「Main Category」というツリー項目も左側に表示されているのがわかります。

    まずは「Client (outbound operations)」を選択し、前回開発した「EchoTimes」を選択して ([Add] ボタンを押すと、下の [Added categories and operations] に追加されます) [OK] ボタンを押して確定させましょう。

  5. これにより、必要な WCF クライアントのスケルトンコードと、App.config へ WCF クライアント用の構成設定がおこなわれます。

    <?xml version=”1.0″ encoding=”utf-8″?>
    <configuration xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0″&gt;
        <system.serviceModel>
            <bindings>
                <myCustomBinding1>
                    <binding name=”CustomAdapter1Binding” closeTimeout=”00:01:00″
                        openTimeout=”00:01:00″ receiveTimeout=”00:10:00″ sendTimeout=”00:01:00″
                        Count=”3″ />
                </myCustomBinding1>
            </bindings>
            <client>
                <endpoint address=”myscheme://hostname/” binding=”myCustomBinding1″
                    bindingConfiguration=”CustomAdapter1Binding” contract=”Custom1OutboundContract”
                    name=”CustomAdapter1Binding_Custom1OutboundContract” />
            </client>
        </system.serviceModel>
    </configuration>

  6. あとは、WCF クライアントを使うときのいつもの要領でOKです。Main に以下の通り記述し、F5 でデバッグ実行してみましょう。

    static void Main(string[] args)
    {
        Custom1OutboundContractClient cl = new Custom1OutboundContractClient();
        string resString = cl.EchoTimes(“こんにちは!”);
        Console.WriteLine(resString);
        Console.ReadLine();
    }

上記で「Count」を「3」に設定しましたので、実行結果は以下のようになります。

inbound オペレーションの利用

次に inbound オペレーションをテストしてみましょう。

  1. まったく同じ要領で [コンソールアプリケーション] を新規作成し、[Add Adapter Service Reference] を選択して今度は「Service (inbound operations)」の中の「DoSomeWork」を選択しましょう。
  2. 生成されたコードと設定は WCF クライアントのものではありません。Adapter に登録された内容を元に、“サービス側” のコードと .config の構成が自動生成されます。
    自動生成されたサービスコードの中で、サービス本体の実装コード (下図) を開くと、

    以下のようなコードが実装されています。

    namespace CustomAdapter1BindingNamespace {
           
        public class CustomAdapter1BindingService : Custom1InboundContract {
           
            public virtual void DoSomeWork(string param) {
                throw new System.NotImplementedException(“The method or operation is not implemented.”);
            }
        }
    }

    これを以下の通り実装しなおしてみましょう。

    namespace CustomAdapter1BindingNamespace {
       
        public class CustomAdapter1BindingService : Custom1InboundContract {
           
            public virtual void DoSomeWork(string param) {
                System.Console.WriteLine(“パラメータ「{0}」を受信!”, param);
            }
        }
    }

  3. そして、Program.cs の Main で以下の通り、このサービスを開始します。

    static void Main(string[] args)
    {
        System.ServiceModel.ServiceHost sv = new System.ServiceModel.ServiceHost(typeof(CustomAdapter1BindingNamespace.CustomAdapter1BindingService));
        sv.Open();
        Console.WriteLine(“サービスを開始!”);
        Console.ReadLine();
        sv.Close();
    }

実行をおこなうと、 5 秒ごとに以下のように表示がおこなわれます。

前回構築したように、このサービスでは毎 5 秒ごとに必ず処理をおこなうように実装されていますが、実際の開発では LOB データベースなどデータに変更があった場合に処理を起動するように実装すると良いでしょう。

無論、同じ手法で、WCF を使って BizTalk Adapter Pack に登録されているアダプター (SAP のアダプター、Siebel のアダプター、Oracle のアダプター) も呼び出すことが可能です (これらも、同じ要領で構築されているためです)。
下記はこのアダプターを使って Oracle データベースに接続し、scott ユーザのテーブル (table) に対するオペレーションを参照している例です (このように Oracle の場合、データベース内のスキーマ (= Oracleの場合はユーザです)、テーブルなどの状況に応じて選択可能なカテゴリやオペレーションが動的に生成されるようになっています)。

Oracle のアダプター (しかも inbound senario) を活用する手法については、以下が参考になります。

http://msdn2.microsoft.com/en-us/library/cc185277.aspx

今回は基本的な動作をあえて WCF を使ってみることでその動きのベースが理解できたと思いますが、BizTalk から使用する場合にもこの双方のシナリオに対応して BizTalk 側に処理を実装できます。
特に inbound の処理が不思議に思われるかもしれませんが、この WCF の上にかぶさっている Adapter Framework を使うと、上記のサンプル同様に BizTalk 側がサービスとなって変更などを待機するようにプロセスを構成することができるようになっています。

次回では、その BizTalk を使ったアダプターの実際の活用方法をみていきましょう。

 

Advertisements

Categories: Uncategorized

Tagged as:

3 replies »

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s