WorkflowCommitWorkBatch サービス サンプルの使用
このサンプルでは Windows Workflow Foundation を使用して、カスタム サービスを作成し、それらのサービスを使用するワークフロー インスタンスと同じトランザクションに追加する方法を示します。
複合アクティビティにトランザクションの動作が関連付けられている場合は、作業バッチも関連付けられています。この複合アクティビティに含まれているいずれかのアクティビティが、ホストによって提供されるサービスに対してメソッドを呼び出す場合、そのサービスも作業バッチの一部なっている可能性があります。複合アクティビティが完了すると、作業バッチはコミットされます。何らかの理由でコミットできない項目があった場合は、作業バッチ全体がロールバックされます。コミット処理の一部として、トランザクション コンテキストがバッチ内の全項目に提供されます。このため、トランザクションに参加するサービスは、トランザクション コンテキストも取得します。これにより、サービスによる呼び出しには、このトランザクション コンテキストも渡されます。最も一般的な例として、トランザクション コンテキストをデータベース呼び出しに渡すことで、データベース呼び出しを同じトランザクションの一部として扱われるようにすることができます。
作業バッチへの参加
作業バッチに参加するには、サービスに IPendingWork というインターフェイスを実装する必要があります。
作業バッチへの登録
サービス (または、作業バッチに参加する必要のあるすべての種類) を作業バッチに参加させるには、それらを作業バッチに登録する必要があります。作業バッチに登録するのに必要な手順を、次のシナリオに示します。
実行中に、アクティビティがサービスに対してメソッドを呼び出します。このメソッドでは実際の作業を実行しません。作業バッチと、その作業の完了に必要なコンテキストを登録するだけです。その後、作業バッチがコミットされるときに、登録時に使用したコンテキストで Commit メソッドが呼び出されます。つまり、実際の作業に適した時期に到達してはじめて、このメソッドは処理を実行することになります。
作業項目を作業バッチに登録するには、次のようにして現在の作業バッチに追加します。
WorkflowEnvironment.WorkBatch.Add(IPendingWork work, object workItem);
サンプルの詳細
このサンプルは送金のシナリオです。普通預金から当座預金に、特定の金額を振り替える場合を考えます。このワークフローでは、まず当座預金への入金を行います。次に、普通預金からの引き落としを試みます。普通預金の預金残高が振り替え金額に満たない場合は、トランザクションが中止され、当座預金は元に戻されます。十分な残高がある場合は、トランザクションが成功します。
コミット メソッドの一部として、トランザクション コンテキストがデータベース呼び出しに渡されます。それによって、データベースも同じトランザクションに参加できるようになります。
このサンプルには、次の 3 つのカスタム アクティビティがあります。
CreditAmount -- 当座預金へ入金するためのアクティビティです。
DebitAmount -- 普通預金から一定金額を引き落とすためのアクティビティです。
TransactionComposite -- SequenceActivity アクティビティから継承される複合アクティビティです。このアクティビティは、トランザクションの動作を提供します。
SQL Server データベースを作成および構成するには
Microsoft SQL Server 2005 Express、SQL Server 2000 以降、または SQL Server 2000 Desktop Engine (MSDE) を使用して、SQL クエリ ステートメント
CREATE DATABASE SqlPersistenceService
で新規データベース SqlPersistenceService を作成します。メモ ワークフロー アプリケーションで SqlTrackingService と SqlWorkflowPersistenceService の両方を使用する場合は、永続性と追跡に対して単一のデータベースを使用することをお勧めします。
SQL クエリ アナライザの作業領域で、使用可能なデータベースの一覧から手順 1. で作成したデータベースを選択します。
[ファイル] メニューの [開く] をクリックして、SQL スクリプト %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<言語>SqlPersistenceService_Schema.sql を開きます。<framework_version> は、コンピュータに現在インストールされている .NET Framework のバージョンです。
[実行] をクリックするか F5 キーを押してクエリを実行し、SQL 永続性サービス テーブルを作成します。
[ファイル] メニューの [開く] をクリックして、SQL スクリプト %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<言語>SqlPersistenceService_ Logic.sql を開きます。<framework_version> は、コンピュータに現在インストールされている .NET Framework のバージョンです。
[実行] をクリックするか F5 キーを押してクエリを実行し、SQL 永続性サービス ストアド プロシージャを作成します。
サンプルをビルドして実行するには
[サンプルのダウンロード] をクリックしてサンプルをダウンロードします****。
サンプル プロジェクトがローカル コンピュータのハード ディスクにダウンロードされます。
.\SQL\TransactionServiceDB.cmd ファイルが提供しているデータベース用のスクリプトを実行して、ransactionServiceSampleDB データベースを作成します。
メモ : このスクリプトは、 TransactionServiceSampleDB という名前のデータベースを作成します。サンプルで使用する接続文字列は、このデータベース名を使用します。
メモ : データベース名を変更する場合は、ソースコードの接続文字列を正しく更新してください。接続文字列が正しくない場合は、サンプルはデータベースに接続できません。また、スクリプトを実行する前に、このスクリプトの 20 行目で SQL サーバーの場所が正しく指定されていることを確認してください。
[スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に、[Microsoft Windows SDK] をポイントし、[CMD シェル] をクリックします****。
サンプルのソース ディレクトリに移動します。
コマンド プロンプトで、「MSBUILD <ソリューション ファイル名>」と入力します。
SDK コマンド プロンプトで、Host\bin\debug フォルダ (このサンプルの VB のバージョンでは、Host\bin フォルダ) にある .exe ファイルを実行します (このサンプルでは、メイン フォルダの下にあります)。
サンプルをデバッグするには、ソリューション エクスプローラでSampleWorkflow プロジェクトを右クリックして [スタートアップ プロジェクトに設定] をクリックし、このプロジェクトをスタートアップ プロジェクトにします。
SampleWorkflow プロジェクトの [プロパティ] ダイアログ ボックスを開きます。
[外部プログラムの開始] をクリックし、Host\bin\Debug フォルダにある host.exe ファイルを選択します。
このサンプルでは、Host.exe ファイルを実行する時点で、普通預金口座から当座預金口座に振り替える金額をユーザーが入力する必要があります。0 以外の正の値を入力してください。トランザクションが成功するか失敗するかは、普通預金の残高によって決まります。いずれかの該当する結果が画面に表示されます。
関連項目
参照
Commit
Add
WorkflowCommitWorkBatchService
その他の技術情報
Windows Workflow CommitWorkBatch Services
Using Transactions in Workflows
Copyright © 2007 by Microsoft Corporation.All rights reserved.