Uncategorized

【SharePoint と BizTalk の連携 (2)】 SharePoint からのドキュメントの受信

環境:
Microsoft Office SharePoint Server (MOSS) 2007 (または WSS 3.0)
BizTalk Server 2006 R2
Visual Studio 2005

SharePoint と BizTalk の連携

  1. 考え方と環境準備
  2. SharePoint からのドキュメントの受信
  3. SharePoint へのドキュメントの送信
  4. タスクリストなど (ドキュメントライブラリ以外のリスト) との連携

こんにちは。

今回は、ドキュメント受信の例として、InfoPath の申請フォームが SharePoint 上で承認されたら、BizTalk Server と連携して所定のフォルダに CSV ファイルを出力する、という例を作成してみましょう。
SharePoint がトリガとなって BizTalk が走るサンプルです。

BizTalk がない方もイメージしやすいように、今回だけ、可能な限り画面イメージも添付してご説明しましょう。

入出力ファイルのデザイン

  1. InfoPath 2007 のフォームをデザインし、保存します。今回は、下図のようにフォームとデータソースをデザインしておきます。
  2. つぎに、出力用の CSV ファイルをデザインします。
    今回は、製品名と価格の入った以下のような .csv のテキストファイルをメモ帳などで作成し、(ANSI で) 保存しておきましょう。A 社業務用冷蔵庫,150000
    プレゼンテーション用ポインティングデバイス,10000

SharePoint の設定

後述しますが、SharePoint 側は (専用のビューを作成するという点を除いては) BizTalk 用の特別な設定は必要ありません。一般に BizTalk を使うシナリオでは、接続する周辺のシステムは BizTalk を意識して構築しなくても良いように配慮されています。

  1. 上記のフォームを SharePoint 上に発行しておいてください。(このドキュメントライブラリーが、承認用のフォームがポストされる InfoPath のフォームライブラリになります)
  2. このフォームライブラリに、SharePoint Designer 2007 で新規にワークフローを作成してください。(何でも構いませんが、タスク割り当てがおこなわれるようなものが良いでしょう、、、)
  3. SharePoint 上で、このフォームライブラリに承認済みドキュメント専用のビューを作成します。
    フォームライブラリ上の [設定] – [ビューの作成] を選択し、今回は 「承認済ドキュメント」 (← この名前はおぼえておきましょうね) という名前のビューとし、フィルタとして下図のように上記のワークフローが 5 となるフィルターのビューを作成します。
    (「5」 は、SharePoint における [完了] ステータス SPWorkflowStatus.Completed の内部番号です。Visual Studio で作成されたカスタムステータスを持つワークフローの場合 には、無論、その番号にあわせておいてください。また、例えば、SharePoint にデフォルトで組み込まれている [承認] ワークフローなど、「完了」以外のステータス文字列が表示されているものも、カスタムのステータス番号 (この場合は 16 です) となっていますので注意しましょう。)

BizTalk におけるスキーマの準備

以前も記載しましたが、実際の開発では、周辺システムに依存しない中立的なメッセージを作成しておき、後述する受信/送信マップの仕組みで周辺システムに固有のメッセージ形式に簡単に変換できますので、本来はこのように作成しておいてください。

このサンプルでは、説明を簡略化する目的から InfoPath のスキーマ定義を BizTalk のオーケストレーション内部で交換するメッセージとしてそのまま使用することにします。

  1. Visual Studio で [空の BizTalk Server プロジェクト] を新規作成します。
  2. このプロジェクト内に、使用するスキーマ定義をすべて取り込んでおきます。
    まず InfoPath のスキーマ定義ですが、フォームの中に入っているのでそのまま使えます。作成した xsn ファイルの拡張子を .cab に変更し、エクスプローラなどで中身を確認すると .xsd ファイル (myschema.xsd) がありますのでこれをコピーし、BizTalk のプロジェクトに追加 (既存の項目の追加) をしておきます。
  3. 次に CSV ファイル側です。
    BizTalk のプロジェクトを右クリックし、[追加] – [新しい項目] で [フラットファイルスキーマウィザード] を選択します。すると、フラットファイルスキーマを作成するためのウィザードが開始されます。
  4. まず、ウィザードの最初の画面で、以下を設定します。インスタンスファイル : <上記で作成した CSV ファイル>
    コードページ : 日本語 Shift-JIS

  5. つぎのウィザードでレコード部分を下図のように選択します。
    今回は 2 行すべてですが、もしヘッダーなど気の利いたことを勝手に実施してしまった方はここでヘッダーを取り除いて選択すればOKです。
  6. つぎに区切り記号を選択します。
    まずは、改行コード (CrLf) を区切り文字としてレコード分割をしますので (そのあとで、カンマ区切りを指定します)、[区切り記号] を選択し、[子区切り記号] として {CR}{LF} を選択してください。
  7. つぎのウィザードで、1 行目の [要素の種類] として [繰り返しレコード]、2 行目の [要素の種類] として [無視] を選択します。(要素名はそのまま XML のタグになりますので、望ましい名前を設定しておいてください)
  8. さらにつぎに進み、今度は「カンマ区切り」の設定に入ります。
    今度は、最初の 1 レコード目 (改行コードは含めない) を選択してつぎに進みます。
  9. 同様に [区切り文字] を選択して、今度は [子区切り文字] として「,」 (カンマ) を選択します。
  10. 要素名とデータ型を下図のように設定します。

これで、CSV ファイルを作成するための .xsd ファイル (スキーマ定義) も作成されました。

BizTalk メッセージの作成

つぎに、上記のスキーマ定義を元に「メッセージ」を作成します。
メッセージは、シリアライズ可能であれば .NET クラス (上記の .xsd ファイルからクラスファイルを自動生成して使用) として受け取ることもできるため開発者の方にとってはこのほうが分かりやすいかもしれませんが、マップの作成などが面倒になりますので、今回は上記の xsd ファイルをそのまま使用します。(この例については、次回とかに使用してみましょう、、、おぼえていれば、、、)

  1. BizTalk プロジェクトを選択し、[追加] – [新しい項目] で [BizTalk オーケストレーション] を追加します。
  2. ソリューションエクスプローラで [オーケストレーション] タブを選択し、新しいメッセージを作成して以下のプロパティを設定しておきましょう。識別子 : OrderMsg
    メッセージの種類 : <上記の InfoPath フォームのスキーマ定義>

BizTalk オーケストレーションの作成

  1. 今回は、InfoPath のデータを受信して csv で出力するだけですので、[受信] 図形、[送信] 図形、受信ポート、送信ポートをドラッグアンドドロップして下図のように配置します。(ポートの配置時にポート構成ウィザードが表示されますので、それぞれ一方向の受信ポート、一方向の送信ポートとして作成しておいてください)
  2. [受信] 図形の [アクティブ化] プロパティを true に設定します。(この図形が処理される際に、インスタンスが生成されるようになります)
  3. [受信] 図形、[送信] 図形のそれぞれについて、[メッセージ] プロパティとして先ほど作成した「OrderMsg」メッセージを設定します。
  4. 受信ポートと [受信] 図形、送信ポートと [送信] 図形を結合します (下図)。
  5. さて、このままですと送信側は InfoPath の XML 形式のまま出力されるだけですので、送信マップを作成して CSV のスキーマにスキーマ変換をおこなえるように準備をしておきます (このマップは、後述する物理ポートの設定で使用します)。
    BizTalk プロジェクトを右クリックし、[追加] – [新しい項目] で [マップ] を追加します。
  6. マップのデザイナーが表示されますので、送信元スキーマとして InfoPath 側のスキーマ定義 (myschema.xsd)、送信先スキーマとして CSV 側のスキーマ定義 (上記で作成した .xsd) を選択しておきます。
  7. 双方のスキーマどうしをドラッグして、下図のようにマップしておきます。(なお、今回は、単一レコードを複数レコードにマップするというちょっと特殊な例になります)
  8. さて、これだけですと XML どうしのスキーマ変換ができただけですので、最後に CSV フォーマット生成用にカスタムの送信パイプラインを準備します (このカスタムパイプラインも後述する物理ポートの設定で使用できるように準備しておくのみです)。
    BizTalk プロジェクトを右クリックし、[追加] – [新しい項目] で、こんどは [送信パイプライン] を追加します。
  9. 表示されるデザイナ上の [アセンブル] 処理の中に、下図のように、左のツールボックスから [フラットファイルアセンブラ] をドラッグアンドドロップして配置します。

ビルドと配置

ここまでは普通の BizTalk のチュートリアルです。ここからが、SharePoint と物理的に接続をおこなう説明の「要」になります。

  1. BizTalk プロジェクトに署名を添付します。
    まずは署名のためにキーファイルを作成するため、Visual Studio コマンドプロンプトを開き、以下のコマンドを入力します。

    C:\Demo> sn -k <キーファイル名>
  2. BizTalk のプロジェクトを右クリックして [プロパティ] を選択し、[共有プロパティ] – [アセンブリ] で [キーファイル名] 欄で上記のファイルを選択して設定します。
  3. プロジェクトのプロパティを開き、[構成プロパティ] – [展開] で、適当に (任意に) アプリケーション名などを設定しておきます。
  4. プロジェクトを右クリックして、[リビルド] と [配置] をおこないます。
    これで BizTalk Server 上に、上記で作成した BizTalk のアプリケーションが配置されました。
  5. さて、上述のオーケストレーションで作成したポートは論理ポートであり、ここから実際にシステムに接続するための物理ポートを設定していきます。
    つまり、この物理ポートの設定 (および設定するマップやパイプライン) 次第で、前述したオーケストレーションを使って、いかようにも周辺システムとの接続方法を変更することができるようになります。まずは、[BizTalk Server 管理] コンソールを起動します。
  6. SharePoint (MOSS 2007 / WSS 3.0) の接続の設定を実施します。
    起動した [BizTalk Server 管理] コンソールで、配置されたアプリケーションの [受信ポート] ノードを左のツリーから選択し、[新規作成] – [静的な一方向の受信ポート] を選択すると物理ポート(受信ポート)の新規画面が表示されます。
    この画面上で左から [受信場所] を選択し、[新規作成] ボタンを押します。
  7. 受信場所の作成画面が表示されますので、以下の通り設定します。種類 : Windows SharePoint Services (← これで、WSS Adapter が設定されます)
    受信パイプライン : XMLReceive

    今回は InfoPath の XML データを受信するため受信パイプラインは上記の通り設定していますが、Excel, Word などの Open XML 形式のファイルを受け取るには、PassThruReceive としてバイナリで受け取るか、受信パイプラインを独自に作成して処理することなります。

  8. つぎに、上図の画面上の [構成] ボタンを押して WSS Adapter の設定をおこなっていきます。この [構成] ボタンを押すと下図の画面が表示されますので、プロパティとして以下を設定します。アダプタ Web サービスポート : <接続する SharePoint Web アプリケーションのポート番号です>
    SharePoint サイト URL : <接続する SharePoint サイトの URL>
    基になるドキュメントライブラリ URL : <連携するリスト (ドキュメントライブラリ) の、上記のサイトからの相対パス>
    ビュー名 : <どのビューでそのリスト (ドキュメントライブラリ) をポーリングするか>
    ポーリング間隔 : <リスト (ドキュメントライブラリ) のポーリングをおこなう間隔の秒数>

    前回も記載しましたが、ボーリングをしているという点は重要です。つまり、SharePoint 側から情報を Push している形ではないので、SharePoint と BizTalk の結合関係を知っているのは BizTalk Server だけです。
    また今回は、SharePoint 側のビュー名として「承認済ドキュメント」を設定しますので、上記で作成した「承認済ドキュメント」のビューに項目が入ってきたときに BizTalk のインスタンスが開始されます。
    また今回使用しませんが、「アーカイブ先 URL」と「アーカイブファイル名」を指定すると、処理されたデータがそのドキュメントライブラリにアーカイブされます。(アーカイブファイル名をブランクにすると、もとと同じ名前で保存されます。)

  9. つぎに送信側 (CSV ファイル側) の物理ポートを設定しましょう。
    [BizTalk Server 管理] コンソールで、こんどは配置されたアプリケーションの [送信ポート] ノードを左のツリーから選択し、[新規作成] – [静的な一方向の送信ポート] を選択します。
  10. [全般] タブで、以下の通り設定します。また [構成] ボタンを押して、FILE アダプターの設定で、出力先のディレクトリを選択しておきます。(下図のようになります)型 : FILE
    送信パイプライン : <前述で作成したカスタムの CSV 送信用パイプライン>

  11. つぎに、画面左の [送信マップ] タブを選択し、上述で作成した送信マップを選択します。
  12. さいごに、ここで作成した物理ポートと、オーケストレーションで作成した論理ポートをバインドします。
    [BizTalk Server 管理] コンソールでオーケストレーションのプロパティ画面を表示し、[バインド] タブを選択して、下図の通りマッピングをおこないます。(ホストもちゃんと選択しておきましょう)

動作確認とおさらい

では、動かしてみましょう。
[BizTalk Server 管理] コンソールで配置されたアプリケーションを開始します。

SharePoint サーバ上で、上記で作成したフォームライブラリにフォームを登録しても、CSV ファイルは作成されないことがわかります。
そして、登録したフォーム (XML) のワークフローを実行してワークフローを完了させると、上述で設定した秒数後に CSV ファイルが作成 (1 行だけ存在) されます。

さて、この処理を動かして頂くとわかるのですが、フォームライブラリのドキュメントはサブスクライブされて削除されてしまうのがわかります。ですから、実際の設定では、前述したアーカイブ URL を指定して承認回覧されたフォームをコピーしておくか、あるいは InfoPath のフォームを「仕掛用」と「承認回覧用」に 2 箇所のドキュメントライブラリに発行し、フォーム上に [申請] ボタンなどを付けておいてこのボタンが押されたら 「承認回覧用」 のドキュメントライブラリにこのフォームをポストする (以降はワークフロー完了後、BizTalk と連携して、このフォームがサブスクライブされる)、といった感じで作成しておくと良いかもしれません。

また、上記の作成方法でおわかりのように、BizTalk では XML (もしくは XML などにシリアライズ可能な .NET クラス) をベースに処理を組み立てるので、実のところ InfoPath の XML 文書とは相性が良いのです。Word 文書、Excel 文書などバイナリのメッセージを受け取る場合にはもう少し複雑になってきます。
一般にバイナリを受け取る場合には、[受信パイプライン] を「PassThruReceive」に設定しておきますが、実際には Open XML の解析が必要になるでしょうから (例 : ドキュメントに記載された内容に従って分岐処理をおこなう、など)、上述のようにカスタムパイプラインを作成して処理を自作で記述する必要が生じるでしょう。あるいは、こちら に記載した方法で SharePoint のリストと関連付けておけば、このシリーズの第 4 回で述べる方法を使用して必要な属性だけ取り出すといったことも容易に可能かもしれません (すみません、試していませんが、、、)。その他の方法としては、Excel や Word 上にボタンなどを配置してカスタムのコードから、あるいは SharePoint のイベントレシーバーなどを使って、データだけを XML をフォームライブラリなどのリストへ XML としてポストするようにすると、以降は上記と同様に連携できるでしょう。

今回はかなりがっちりと記載しましたが、次回以降はこれをベースにポイントに絞って説明したいので、次回以降も、ここに記載した内容を抑えておいてください。

 

Categories: Uncategorized

Tagged as: , ,

6 replies»

Leave a Reply