次の方法で共有


BizTalk Serverを使用して SQL からクエリ通知を増分的に受信する

重要

簡潔にするために、このトピックでは、通知を段階的に受信する方法のみを説明します。 ビジネス シナリオでは、受信した通知メッセージの種類を抽出し、後続の操作を実行するロジックをオーケストレーションに含めるのが理想的です。 言い換えると、このトピックで説明するオーケストレーションは、「BizTalk Serverを使用して SQL で特定のタスクを完了するために通知メッセージを処理する」で説明されているオーケストレーションの上に構築する必要があります。

このトピックでは、SQL Server データベースから増分クエリ通知メッセージを受信するように SQL アダプターを構成する方法について説明します。 増分通知を示すには、"Status" 列を含むテーブル Employee を検討してください。 このテーブルに新しいレコードを挿入すると、Status 列の値は 0 に設定されます。 増分通知を受信するようにアダプターを構成するには、次の操作を行います。

  • Status 列が 0 のすべてのレコードを取得する SQL ステートメントを使用して通知に登録します。 これを行うには、 NotificationStatement バインド プロパティに SQL ステートメントを指定します。

  • 通知メッセージが受信された行の場合は、Status 列を 1 に更新します。

    このトピックでは、BizTalk オーケストレーションを作成し、これを実現するために BizTalk アプリケーションを構成する方法について説明します。

SQL アダプターのバインド プロパティを使用した通知の構成

次の表は、SQL Serverからの通知の受信を構成するために使用する SQL アダプター のバインド プロパティをまとめたものです。 BizTalk Server管理コンソールで受信ポートを構成するときに、これらのバインド プロパティを指定する必要があります。

Note

Notification 操作のスキーマを生成するときに、必須ではない場合でも、これらのバインド プロパティを指定することもできます。 その場合、アダプター サービス アドインを使用してメタデータ生成の一部として生成されるポート バインド ファイルには、バインド プロパティに指定した値も含まれます。 このバインド ファイルは、後で BizTalk Server 管理コンソールにインポートして、バインド プロパティが既に設定されている WCF-custom または WCF-SQL 受信ポートを作成できます。 バインド ファイルを使用してポートを作成する方法の詳細については、「 SQL アダプターを使用するようにポート バインド ファイルを使用して物理ポート バインドを構成する」を参照してください。

Binding プロパティ 説明
InboundOperationType 実行する受信操作を指定します。 通知メッセージを受信するには、これを [通知] に設定します。
NotificationStatement クエリ通知の登録に使用する SQL ステートメント (SELECT または EXEC <ストアド プロシージャ>) を指定します。 アダプターは、指定した SQL ステートメントの結果セットが変更された場合にのみ、SQL Serverから通知メッセージを取得します。
NotifyOnListenerStart リスナーの起動時にアダプターがアダプター クライアントに通知を送信するかどうかを指定します。

これらのプロパティの詳細については、「BizTalk Adapter for SQL Server アダプター のバインド プロパティに関するページを参照してください。 SQL アダプターを使用してSQL Serverから通知を受信する方法の詳細については、詳細を参照してください。

このトピックでは、通知メッセージの受信方法について説明します

SQL アダプターがSQL Serverからの通知メッセージの受信をサポートする方法を示すために、このトピックでは、Employee テーブルへの変更に関する通知を受信するようにアダプターを構成する方法について説明します。 Employee テーブルに、Employee_ID、Name、および Status の各列があるとします。 新しい従業員が追加されるたびに、Status 列の値は 0 に設定されます。

通知を受け取る方法を示すには、次の操作を行います。

  • 通知 (受信 操作) のスキーマを生成し、Employee テーブルの Select (送信操作) を行います。

  • 次のオーケストレーションを作成します。

    • 通知メッセージを受信する受信場所。 通知用に構成するには、SELECT ステートメントを次のように指定します。

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0  
      

      Note

      この SELECT ステートメントに示すように、 ステートメントで列名を明示的に指定する必要があります。 また、テーブル名とスキーマ名を常に指定する必要があります。 たとえば、「 dbo.Employee 」のように入力します。

    • 通知が既に送信されている行を更新する送信ポート。 そのためには、[状態] 列の値を 1 に設定します。 これは、アダプターに次のメッセージを送信することで、Select 操作の一部として行うことができます。

      <Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
        <Columns>Employee_ID,Name,Status</Columns>  
        <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
      </Select>  
      

      このメッセージでは、 要素の <Query> 一部として、Status 列を更新する UPDATE ステートメントを指定します。 この操作は、処理された行が更新されるように、通知メッセージを受信した後に実行する必要があることに注意してください。 通知応答の取得を待機し、手動で要求メッセージを削除して行を更新するオーバーヘッドを取り除くには、オーケストレーション自体内の行を更新するための要求メッセージを生成します。 これを行うには、オーケストレーション内で メッセージの構築 図形を使用します。

SQL Server データベースから通知メッセージを受信する方法

BizTalk Serverで SQL アダプターを使用してSQL Server データベースに対して操作を実行するには、「Sql アダプターを使用して BizTalk アプリケーションを開発するための構成要素」で説明されている手順に従います。 通知メッセージを受信するようにアダプターを構成するには、次のタスクを実行します。

  1. BizTalk プロジェクトを作成し、Employee テーブルの Notification (受信操作) と Select (送信操作) のスキーマを生成します。 必要に応じて、 InboundOperationType および NotificationStatement バインド プロパティの値を指定できます。

  2. SQL Server データベースから通知を受信するためのメッセージを BizTalk プロジェクトに作成します。

  3. SQL Server データベースで Select 情報を実行し、応答メッセージを受信するためのメッセージを BizTalk プロジェクトに作成します。

  4. 次の処理を行うオーケストレーションを作成します。

    • SQL Serverから通知メッセージを受信します。

    • 通知を受信する行を選択して更新するメッセージを作成します。

    • このメッセージをSQL Serverに送信して行を更新し、応答を受信します。

  5. BizTalk プロジェクトをビルドして展開します。

  6. 物理送受信ポートを作成して BizTalk アプリケーションを構成します。

    Note

    通知メッセージの受信などの受信操作では、一方向の WCF-Custom または WCF-SQL 受信ポートのみを構成する必要があります。 双方向 WCF-Custom または WCF-SQL 受信ポートは、受信操作ではサポートされていません。

  7. BizTalk アプリケーションを起動します。

    このトピックでは、これらのタスクを実行する手順について説明します。

このトピックに基づくサンプル

このトピックに基づく IncrementalNotification のサンプルは、BizTalk アダプター パックと共に提供されています。 詳細については、「 SQL アダプターのサンプル」を参照してください。

スキーマの生成

通知操作のスキーマを生成し、Employee テーブルで Select 操作をう必要があります。 スキーマの生成方法の詳細については、「SQL アダプターを使用して Visual Studio でSQL Server操作のメタデータを取得する」を参照してください。 スキーマを生成するときは、次のタスクを実行します。 デザイン時にバインド プロパティを指定しない場合は、最初の手順をスキップします。

  1. スキーマの生成中に 、InboundOperationType および NotificationStatement バインド プロパティの値を指定します。 このバインディング プロパティの詳細については、「BizTalk Adapter for SQL Server アダプター バインド プロパティの読み取り」を参照してください。 バインド プロパティを指定する方法については、「 SQL アダプターのバインド プロパティを構成する」を参照してください。

  2. コントラクトの種類を [サービス (受信操作)] として選択します。

  3. 通知操作のスキーマを生成します。

  4. コントラクトの種類を [ クライアント (送信操作)] として選択します。

  5. Employee テーブルの Select 操作のスキーマを生成します。

メッセージとメッセージの種類の定義

前に生成したスキーマでは、オーケストレーション内のメッセージに必要な "型" について説明します。 通常、メッセージは変数であり、対応するスキーマによって定義される型です。 スキーマが生成されたら、BizTalk プロジェクトのオーケストレーション ビューからメッセージにリンクする必要があります。

このトピックでは、3 つのメッセージを作成する必要があります。1 つはSQL Server データベースから通知を受信し、もう 1 つは Select 操作を実行し、もう 1 つは Select 操作の応答を受信します。

メッセージを作成し、スキーマにリンクするには、次の手順を実行します。

  1. BizTalk プロジェクトにオーケストレーションを追加します。 ソリューション エクスプローラーから BizTalk プロジェクト名を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。 BizTalk オーケストレーションの名前を入力し、[ 追加] をクリックします。

  2. BizTalk プロジェクトがまだ開いていない場合は、オーケストレーション ビュー ウィンドウを開きます。 [ 表示] をクリックし、[ その他のウィンドウ] をポイントして、[ オーケストレーション ビュー] をクリックします。

  3. オーケストレーション ビューで、[メッセージ] を右クリックし、[新しいメッセージ] をクリックします。

  4. 新しく作成したメッセージを右クリックし、[ プロパティ ウィンドウ] を選択します。

  5. Message_1[プロパティ] ウィンドウで、次の操作を行います。

    プロパティ 目的
    識別子 NotifyReceive.
    メッセージ型 ドロップダウン リストから [ スキーマ] を展開し、[ SQLNotify.Notification] を選択します。 SQLNotify は BizTalk プロジェクトの名前です。 Notification は、 Notification 操作用に生成されたスキーマです。
  6. 手順 3 を繰り返して、2 つの新しいメッセージを作成します。 新しいメッセージの [プロパティ ] ウィンドウで、次の操作を行います。

    識別子を に設定する メッセージの種類を に設定する
    Select SQLNotify.TableOperation_dbo_Employee.Select。ここでTableOperation_dbo_EmployeeSelect 操作用に生成されたスキーマです
    SelectResponse SQLNotify.TableOperation_dbo_Employee.SelectResponse

オーケストレーションの設定

SQL Server データベースから通知メッセージを受信し、通知を受信した行を更新するためにBizTalk Serverを使用するには、BizTalk オーケストレーションを作成する必要があります。 このオーケストレーションでは、アダプターは NotificationStatement バインディング プロパティに指定された SELECT ステートメントに基づいて通知メッセージを受信します。 通知メッセージは FILE の場所で受信されます。 応答を受信すると、オーケストレーションは、通知を受信する行を更新するために使用されるメッセージを構築します。 このメッセージの応答は、同じ FILE の場所でも受信されます。

そのため、オーケストレーションには次のものが含まれている必要があります。

  • 通知メッセージを受信する一方向の受信ポート。

  • 行を更新し、同じに対する応答を受信するメッセージを送信する双方向送信ポート。

  • オーケストレーション内で更新操作を実行するためのメッセージを構築するメッセージの 構築 図形。

  • 更新操作の応答を保存する FILE 送信ポート。

  • 図形を受信および送信します。

    サンプル オーケストレーションは次のようになります。

    SQL Server通知を受信するオーケストレーション

メッセージ図形の追加

メッセージ図形ごとに次のプロパティを指定してください。 [図形] 列に一覧表示される名前は、単一のオーケストレーションに表示されるメッセージ図形の名前です。

図形 図形の種類 プロパティ
ReceiveNotification 受信 - 名前を ReceiveNotification に設定する

- Activate をTrue に設定する
SaveNotification Send - 名前を SaveNotification に設定する
SendSelectMessage Send - 名前を SendSelectMessage に設定する
ReceiveSelectResponse 受信 - 名前を ReceiveSelectResponse に設定する
SaveSelectResponse Send - 名前SaveSelectResponse に設定する

メッセージの構築図形の追加

[ メッセージの構築] 図形を使用すると、操作内で要求メッセージを生成して Select 操作を実行できます。 これを行うには、 メッセージの構築 図形を追加し、その中に メッセージ割り当て 図形をオーケストレーションに追加する必要があります。 この例では、[メッセージの割り当て] 図形は、select 操作を実行するためにSQL Serverに送信されるメッセージを生成するコードを呼び出します。 [メッセージの割り当て] 図形では、メッセージをSQL Serverに送信するアクションも設定します。

メッセージ構築図形の場合は、 Message Constructed プロパティを Select に設定します。

応答を生成するコードは、BizTalk プロジェクトと同じ Visual Studio ソリューションの一部である可能性があります。 応答メッセージを生成するためのサンプル コードは次のようになります。

namespace SampleMessageCreator  
{  
    public class SampleMessageCreator  
    {  
        private static XmlDocument Message;  
        private static string XmlFileLocation;  
        private static string ResponseDoc;  
        public static XmlDocument XMLMessageCreator()  
        {  
            XmlFileLocation = "C:\\TestLocation\\CreateMessage";  
            try  
            {  
                ResponseDoc = (Directory.GetFiles(XmlFileLocation, "*.xml", SearchOption.TopDirectoryOnly))[0];  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Trying to get XML from: " + XmlFileLocation);  
                Console.WriteLine("EXCEPTION: " + ex.ToString());  
                throw ex;  
            }  
            //Create Message From XML  
            Message = new XmlDocument();  
            Message.PreserveWhitespace = true;  
            Message.Load(ResponseDoc);  
            return Message;  
        }   
    }  
}  

上記のコードの抜粋で要求メッセージを生成できるようにするには、変数に指定された XmlFileLocation 場所に XML 要求メッセージ (Employee テーブルの Select 操作用) が必要です。

Note

プロジェクトをビルドすると、プロジェクト ディレクトリに SampleMessageCreator.dll が作成されます。 この DLL をグローバル アセンブリ キャッシュ (GAC) に追加する必要があります。 また、SampleMessageCreator.dll を参照として BizTalk プロジェクトに追加する必要があります。

次の式を追加して、このコードを [メッセージの割り当て] 図形から呼び出し、メッセージのアクションを設定します。 式を追加するには、[ メッセージの割り当て ] 図形をダブルクリックして式エディターを開きます。

Select = SampleMessageCreator.SampleMessageCreator.XMLMessageCreator();  
Select(WCF.Action) = "TableOp/Select/dbo/Employee";  

ポートの追加

論理ポートごとに次のプロパティを指定してください。 [ポート] 列に表示される名前は、オーケストレーションに表示されるポートの名前です。

Port プロパティ
SQLNotifyPort - 識別子SQLNotifyPort に設定する

- SQLNotifyPortType に設定する

- 通信パターン一方向に設定する

- 受信する通信方向を設定する
SaveMessagePort - 識別子SaveMessagePort に設定する

- TypeSaveMessagePortType に設定する

- 通信パターン一方向に設定する

- [通信の方向] を [送信] に設定する

- Notify 操作を作成します。 この操作は、通知メッセージに使用されます。

- 操作の作成 選択します。 この操作は、選択応答メッセージに使用されます。
SQLOutboundPort - 識別子SQLOutboundPort に設定する

- SQLOutboundPortType に設定する

- 通信パターンRequest-Response に設定する

- [通信の方向] を [送受信] に設定する

アクション図形のメッセージを指定し、ポートに接続する

次の表では、アクション図形のメッセージを指定し、メッセージをポートにリンクするために設定する必要があるプロパティとその値を指定します。 [図形] 列に表示される名前は、前述のオーケストレーションに表示されるメッセージ図形の名前です。

図形 プロパティ
ReceiveNotification - MessageNotifyReceive に設定する

- 操作SQLNotifyPort.Notify.Request に設定する
SaveNotification - MessageNotifyReceive に設定する

- 操作SaveMessagePort.Notify.Request に設定する
SendSelectMessage - メッセージ選択に設定する

- 操作SQLOutboundPort.Select.Request に設定する
ReceiveSelectResponse - メッセージSelectResponse に設定する

- 操作SQLOutboundPort.Select.Response に設定する
SaveSelectResponse - メッセージSelectResponse に設定する

- 操作SaveMessagePort.Select.Request に設定する

これらのプロパティを指定すると、メッセージの図形とポートが接続され、オーケストレーションが完了します。

BizTalk ソリューションをビルドし、BizTalk Serverに展開する必要があります。 詳細については、「オーケストレーションの ビルドと実行」を参照してください。

BizTalk アプリケーションの構成

BizTalk プロジェクトを展開すると、先ほど作成したオーケストレーションが、BizTalk Server管理コンソールの [オーケストレーション] ウィンドウの下に一覧表示されます。 アプリケーションを構成するには、BizTalk Server管理コンソールを使用する必要があります。 チュートリアルについては、「 チュートリアル: 基本的な BizTalk アプリケーションの展開」を参照してください。

アプリケーションの構成には、次の作業が含まれます。

  • アプリケーションのホストの選択。

  • オーケストレーションで作成したポートを、BizTalk Server管理コンソールの物理ポートにマッピングします。 このオーケストレーションでは、次の操作を行う必要があります。

    • 物理 WCF-Custom または WCF-SQL 一方向の受信ポートを定義します。 このポートは、SQL Server データベースからの通知をリッスンします。 ポートを作成する方法については、「 SQL アダプターへの物理ポート バインドを手動で構成する」を参照してください。 受信ポートには、次のバインド プロパティを指定してください。

      重要

      デザイン時にバインド プロパティを指定した場合は、この手順を実行する必要はありません。 このような場合は、アダプター サービス アドインを使用して作成されたバインド ファイルをインポートすることで、必要なバインド プロパティを設定して、WCF-custom または WCF-SQL 受信ポートを作成できます。 詳細については、「 SQL アダプターを使用するようにポート バインド ファイルを使用して物理ポート バインドを構成する」を参照してください

      Binding プロパティ
      InboundOperationType これを [通知] に設定します。
      NotificationStatement これを次の値に設定します。

      SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0

      メモ: この SELECT ステートメントに示すように、 ステートメントで列名を具体的に指定する必要があります。 また、テーブル名とスキーマ名を常に指定する必要があります。 たとえば、「 dbo.Employee 」のように入力します。
      NotifyOnListenerStart これを True に設定 します

      さまざまなバインド プロパティの詳細については、「BizTalk Adapter for SQL Server アダプター のバインド プロパティ」を参照してください。

      Note

      SQL アダプターを使用して受信操作を実行するときに、トランザクション分離レベルとトランザクション タイムアウトを構成することをお勧めします。 これを行うには、WCF-Custom または WCF-SQL 受信ポートの構成中にサービスの動作を追加します。 サービスの動作を追加する方法については、「SQL を使用して トランザクション分離レベルとトランザクション タイムアウトを構成する」を参照してください。

    • SQL Server データベースにメッセージを送信する物理 WCF-Custom または WCF-SQL 送信ポートを定義します。 また、送信ポートでアクションを指定する必要があります。

    • ハード ディスク上の場所と、BizTalk オーケストレーションがSQL Server データベースからメッセージを削除する対応するファイル ポートを定義します。 これらは、SQL Serverから受信した通知メッセージと、WCF-Custom または WCF-SQL 送信ポートを介して実行する Select and Update 操作のメッセージです。

アプリケーションの起動

SQL Server データベースから通知メッセージを受信し、後続の Select 操作と Update 操作を実行するために、BizTalk アプリケーションを起動する必要があります。 BizTalk アプリケーションを起動する手順については、「オーケストレーションを 開始する方法」を参照してください。

この段階で、次のことを確認します。

  • WCF-Custom または WCF-SQL の一方向受信ポート。これは、実行中のSQL Server データベースから通知メッセージを受信します。

  • Employee テーブルに対して Select 操作と Update 操作を実行する WCF-Custom または WCF-SQL 送信ポートが実行されています。

  • SQL Serverからメッセージを受信する FILE 送信ポートが実行されています。

  • 操作の BizTalk オーケストレーションが実行されています。

操作の実行

この操作を実行するには、Employee テーブルにレコードを挿入する必要があります。 次の詳細を含むレコードを挿入するとします。

Name = John Smith  
Designation = Manager  
Salary = 100000  

また、Select 操作と Update 操作を実行する XML メッセージが C:\TestLocation\MessageIn で使用できることを確認します。 XML ファイルは次のようになります。

<Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
  <Columns>Employee_ID,Name,Status</Columns>  
  <Query>where Status=0;UPDATE Employee SET Status=1 WHERE Status=0</Query>  
</Select>  

レコードが挿入されると、同じ順序で次の一連のアクションが実行されます。

  • アダプターは、次のような通知メッセージを受信します。

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Insert</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    このメッセージは、レコードが Employee テーブルに挿入されたことを通知します。 要素の値 <Info> は "Insert" であることに注意してください。

  • アダプターは Select 操作を実行します。 Select 操作 XML にも Update ステートメントが含まれているため、Update ステートメントも実行されます。 SQL Serverからの次の応答は、Select ステートメントに対する応答です。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult>  
        <Employee xmlns="http://schemas.microsoft.com/Sql/2008/05/Types/Tables/dbo">  
          <Employee_ID>10006</Employee_ID>   
          <Name>John</Name>   
          <Status>0</Status>  
        </Employee>  
      </SelectResult>  
    </SelectResponse>  
    

    この応答は、レコードが Employee テーブルに挿入され、そのレコードの Status が 0 であることを示しています。

  • Select ステートメントの一部として、Update ステートメントも実行され、新しいレコードの Status 列が 1 に変更されます。 これにより、SQL Serverから別の通知がトリガーされ、アダプターは対応する通知メッセージを受信します。これは次のようになります。

    <?xml version="1.0" encoding="utf-8" ?>   
    <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">  
      <Info>Update</Info>   
      <Source>Data</Source>   
      <Type>Change</Type>   
    </Notification>  
    

    このメッセージは、Employee テーブルでレコードが更新されたことを通知します。 要素の値 <Info> は "Update" であることに注意してください。

  • 2 番目の通知の後、アダプターは Select ステートメントを実行します。 ただし、Status が 0 のレコードは存在しないため、アダプターは次のような空の応答を取得します。

    <?xml version="1.0" encoding="utf-8" ?>   
    <SelectResponse xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee">  
      <SelectResult />   
    </SelectResponse>  
    

ベスト プラクティス

BizTalk プロジェクトを展開して構成したら、バインド ファイルと呼ばれる XML ファイルに構成設定をエクスポートできます。 バインド ファイルを生成したら、同じオーケストレーションの送信ポートと受信ポートを作成する必要がないように、ファイルから構成設定をインポートできます。 バインド ファイルの詳細については、「 SQL アダプター バインドの再利用」を参照してください。

参照

BizTalk Serverを使用して SQL クエリ通知を受信する