2011-01-13 2 views
0

메시징 작업을 사용하여 워크 플로를 시작하고 유지했습니다. Start initial 명령과 Stop final 명령 간의 상관 관계가 몇 초 내에 전송되면 제대로 작동합니다. LoadWorkflowByInstanceKeyCommand.AssociateLookupKeyToInstanceId를 지정하지 않으면지속 된 워크 플로를로드하는 중 오류가 발생했습니다.

에서, LookupInstanceKey 이미 인스턴스에 연결되어 있어야합니다 또는 LoadWorkflowByInstanceKeyCommand 실패합니다 : 워크 플로가 언로드 될 때 다음과 같은 중지 메시지는 다음 오류 예외를 throw 때문에 문제는 시작합니다. 이러한 이유 때문에 AssociateLookupKeyToInstanceId가 설정되지 않은 경우 LookupInstanceKey를 InstanceKeysToAssociate 컬렉션에 지정하는 것은 유효하지 않습니다.

아무도 도와 줄 수 있습니까? 워크 플로의 변수는 int 및 XDocument 형식입니다. 이것은 WorkflowServiceHost를 초기화하는 코드입니다 :

WorkflowServiceHost serviceHost = new WorkflowServiceHost(myWorkflow, new Uri(serviceUri)); 
      ServiceDebugBehavior debug = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
      if (debug == null) 
      { 
       debug = new ServiceDebugBehavior(); 
       serviceHost.Description.Behaviors.Add(debug); 
      } 

      debug.IncludeExceptionDetailInFaults = true; 
      WorkflowIdleBehavior idle = serviceHost.Description.Behaviors.Find<WorkflowIdleBehavior>(); 
      if (idle == null) 
      { 
       idle = new WorkflowIdleBehavior(); 
       serviceHost.Description.Behaviors.Add(idle); 
      } 

      idle.TimeToPersist = TimeSpan.FromSeconds(2); 
      idle.TimeToUnload = TimeSpan.FromSeconds(10); 
      var behavior = new SqlWorkflowInstanceStoreBehavior 
      { 
       ConnectionString = ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString, 
       InstanceEncodingOption = InstanceEncodingOption.None, 
       InstanceCompletionAction = InstanceCompletionAction.DeleteAll, 
       InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry, 
       HostLockRenewalPeriod = new TimeSpan(00, 00, 30), 
       RunnableInstancesDetectionPeriod = new TimeSpan(00, 00, 05) 
      }; 
      serviceHost.Description.Behaviors.Add(behavior); 
      serviceHost.Open(); 

데이터베이스를 보면, 워크 플로가 중단되지 않습니다 것으로 보인다.

어떤 도움을 주시면 감사

는 는 감사합니다

답변

0

별로 일이 ​​일어나고 있지만 직렬화하고 디스크에 저장되는 워크 플로우를 방지 할 수있는 워크 플로우에 사용되는 종류가 있습니다처럼 소리가 무엇인지. "데이터베이스를 보면 워크 플로가 일시 중단 된 것처럼 보입니다." 너 정말로 정지 된 거니? 워크 플로가 일시 중지되는 이유는 무엇입니까?

시작 메시지 만 워크 플로로 보내고 2 초 동안 기다리면 어떻게됩니까? 지속성 데이터베이스에 새로운 레코드를 얻었습니까?

+0

일시 중지 된 경우 RunnableInstancesTable 테이블로 이동하고 IsSuspended 값이 InstancesTable 테이블에서 1로 설정됨을 의미합니다. 지연을 추가하면 올바르게 일시 중단되기 때문에 워크 플로를 직렬화 할 수 있습니다. 문제는 WorkflowIdleBehavior.TimeToUnload 경과 후에 워크 플로가 일시 중단되지 않고 Stop 작업을 호출하면 앞서 언급 한 오류가 발생한다는 것입니다. TimeToUnload 시간 초과 전에 중지 작업을 보내면 오류가 발생하지 않습니다. 장기간 실행되는 워크 플로입니다. – fra

+0

워크 플로우 정의에 오류가 발생하여 Stop receive 활동에서 상관 초기화를 반복한다는 것을 알았습니다. 어쨌든, 유휴 워크 플로우가 runnableinstancestable에없는 이유에 대한 설명에 감사드립니다 ... 어쨌든 데이터베이스에 직렬화되고 메모리에서 언로드됩니까? 어떤 정책이 사용됩니까? – fra

+0

지속 된 워크 플로는 InstancesTable 테이블에 저장되며 RunnableInstancesTable은 모든 워크 플로가 정상적으로 작동하지 않을 때 워크 플로 복구에 사용됩니다. 일반적으로 워크 플로가 지속되는 경우 일시 중단되지 않고 정책이 AbandonAndSuspend로 설정된 경우 일시 중단됩니다. 즉, 워크 플로가 자동으로 다시 시작되지는 않지만 수동으로 다시 시작해야합니다. – Maurice