2009-06-11 17 views
2

私は特定のデータベースを監視し、トリガーに気づいたときに他のワークフローを開始するワークフローを持っています。私は、この「オブザーバー」ワークフローの1つのインスタンスをいつでも実行できるようにしたいだけです。それ以外の場合は、2つ以上が実行されている場合は、変更に気付き、両方が同じワークフローを起動します。これはうまく機能しません。Windowsワークフロー: "シングルトン"スタイルのワークフロー?

この「オブザーバー」ワークフローは維持されます。だからどうすればいいのですか?実行時にこのワークフローのインスタンスがすでに保持されていない場合は、起動しますが、すでに存在する場合は永続化されたインスタンスを使用します。

私が望むワークフローを始めた小さなラン・ワン・コンソール・アプリケーションを作成した後、「本当の」ランタイムが永続化されたランタイムを取得しただけで新しいものを作成しようとしないようですが、非常にエレガントな音。

答えて

1

私たちはこのプロジェクトの中で少し前にこの問題を抱えていました。私たちが思いついた解決策は、2つのランタイムをホストすることでした。 1つは永続性サービス、もう1つは永続性サービスです。持続性サービスのないランタイムでは、ホストの起動時に自動的に開始されるこの種の「監視ワークフロー」をいくつか実行していました。

この

は、それが実装された方法です。

まず、我々は永続化サービスを設定した設定ファイルを持っていた:

<configuration> 
    <configSections> 
     <section name="RuntimeWithPersistence" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    </configSections> 
    <RuntimeWithPersistence> 
     <CommonParameters/> 
     <Services> 
      <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
      <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="[dbconnectionstring]" UnloadOnIdle="true"/> 
     </Services> 
    </RuntimeWithPersistence> 
</configuration>  

とワークフローホストアプリケーション(カットして編集で、

けど私はアイデアを伝えると思います):

public class WorkflowHost 
{ 
    private WorkflowRuntime _runtime = null; 
    private WorkflowRuntime _nonPersistingRuntime = null; 

    private void SetupRuntime() 
    { 
     // create a new WorkflowRuntime that points out a config section 
     // defining a persistence service 
     _runtime = new WorkflowRuntime("RuntimeWithPersistence"); 
     // set up additional services to use 
     _runtime.StartRuntime() 

     // create a new WorkflowRuntime that does not point out a config section 
     _nonPersistingRuntime = new WorkflowRuntime(); 
     // set up additional services to use 
     _nonPersistingRuntime.StartRuntime() 
     // start monitoring workflows in the non persisting runtime 
     StartMonitoringWorkflows(_nonPersistingRuntime); 
    } 
} 
+0

フィードバックありがとうございます!私はこのアプローチもやっていきましたが、私は別の問題に対するエレガントな解決策を見つけようとしています。監視する人は、前にどのトリガーが発生したのかを知っていなければなりません。それはそれを見ます。だからこそ私は監視システムで永続性を使用することを考えていたので、すでに実行されていることを無視するトリガーのリストを保存することができます。私はそのアイデアが好きで、それをもっと徹底的に調べるでしょう。 – Chris

+0

私たちは同じ考え方をしていましたが、ランタイムが既にワークフローの永続化されたインスタンスを持っているかどうかを簡単かつ確実に判断することができました(ワークフローの世界では相対的に初心者でした。私はそれ以来それを調査していません...) –

2

私は現在、この問題を検討中です。現在作業中です。しかし、DBを監視する機能はワークフローの責任ではないようです。

ランタイムに追加するサービスを作成します。このサービスは、ワークフローがHandleEventActivityでリッスンするイベントを発生させます。そうすることで、ワークフローはアイドル状態になり、実際の作業が実際に必要になるまでその状態が維持されます。

関連する問題