2009-08-18 24 views
2

これは基本的な質問のように思えるが、私はどこにも答えを見つけることができません。のワークフロー永続

私は私は全体の複数のホストアプリケーションで働いています長時間実行ステートマシンワークフロー、いくつかの異なるタイプを持っています中央のデータベースを使用します。私はそれらを永続化するためにSqlWorkflowPersistenceServiceを使用しています。 WorkflowOne、WorkflowTwo、WorkflowThreeという3つのワークフロータイプがあります。それぞれのインスタンスが開始され、1人のユーザーによってデータベースに永続化されます。別のユーザーが来て、さまざまな変更を加えたいので、アプリケーションを起動します。今では永続化サービスを使用して永続化されたすべてのインスタンスのリストを提供できますが、どちらがWorkflowOneタイプで、WorkflowTwoまたはWorkflowThreeであるかをどのように知ることができますか?

答えて

4

これを行う方法はいくつかあります。

最初のオプションはWorkflowPersistenceService自体を使用してのような何かをすることです:あなたはすでにSqlWorkflowPersistenceServiceを使用しているとして行うことを

var persistenceService = new SqlWorkflowPersistenceService("<<connection string>>"); 
var persistedWorkflows = persistenceService.GetAllWorkflows(); 
foreach (var persistedWorkflow in persistedWorkflows) 
{ 
    var workflowInstance = workflowRuntime.GetWorkflow(persistedWorkflow.WorkflowInstanceId); 
    var workflowDefinition = workflowInstance.GetWorkflowDefinition(); 
    Console.WriteLine(workflowDefinition.GetType().FullName); 
} 

簡単にそれがメモリにすべてのワークフローインスタンスをロードすることの欠点を持って、あなたそれらをメモリから削除する責任があります。

2番目のオプションは、ワークフローのトレースを使用することです:

var trackingQuery = new SqlTrackingQuery("<<connection string>>"); 
    var queryOptions = new SqlTrackingQueryOptions() 
    { 
     WorkflowStatus = WorkflowStatus.Running 
    }; 
    var runningWorkflows = trackingQuery.GetWorkflows(queryOptions); 
    foreach (var runningWorkflow in runningWorkflows) 
    { 
     Console.WriteLine(runningWorkflow.WorkflowType); 
    } 

利点は、あなたがちょうどそれがタイプだ確認するためにメモリに実際のワークフロー定義をロードする必要はありませんです。欠点は、SqlTrackingServiceを追加しなければならず、複雑さとオーバーヘッドを追加する独自のデータベースだということです。

+0

ありがとう、モーリス。私は基本的に最初のオプションを実装しました。トラッキングを使用して2番目のものは私が思うが、私は後に何をしています。とにかく追跡を使用することになると思います。その場合は、そのオプションを実装します。再度、感謝します! –

0

これが最善の方法であるかどうかはわかりませんが、各WFインスタンスを水分補給して、Nameプロパティを比較して、探しているインスタンスかどうかを確認してください。

+0

他の誰かがより良い方法を持っているかどうかを確認するために、これを数日間開いたままにします。私自身のパーシスタンスサービスを作成し、インスタンスを保持するためにInstanceStateテーブルに別のフィールドを追加することについても考えましたが、それは過剰なものだと思っていました。 –

関連する問題