2009-06-11 9 views
2

특정 데이터베이스를 감시하고 트리거를 발견하면 다른 워크 플로를 시작하는 워크 플로가 있습니다. 나는이 "관찰자"워크 플로의 한 인스턴스가 어느 시점에서든 진행되기를 원합니다. 그렇지 않으면 두 개 이상이 실행 중이면 두 워크 플로 모두 변경 사항을 확인하고 둘 다 똑같은 워크 플로를 실행하므로 제대로 작동하지 않습니다.Windows 워크 플로 : "싱글 톤"스타일 워크 플로?

이 "관찰자"워크 플로는 유지됩니다. 그래서 ... 어떻게하면 런타임에이 워크 플로의 인스턴스가 이미 유지되지 않았 으면 하나를 시작하지만 이미있는 경우에는 지속 된 인스턴스 만 사용하도록 할 수 있습니까?

내가 원하는 워크 플로우를 시작한 작은 run-once 콘솔 앱을 만든 다음 "진짜"런타임이 영구적 인 하나의 런타임을 끌어 와서 새로운 것을 생성하려고 시도하지 않은 것처럼 들릴 수도 있지만, 매우 우아한 소리.

답변

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에서 수신하는 이벤트를 발생시킵니다. 그런 식으로 워크 플로가 유휴 상태로 유지되고 실제 작업이 실제로 필요하기 전까지는 지속됩니다.

관련 문제