2011-11-03 3 views
1

으로 고정 된 우리는 워크 플로 기반을위한 자체 워크 플로 지속 계층에서 작업합니다.더 복잡한 프로젝트의 일환으로 워크 플로 지속성 (자체 공급자)

로드가되어 실행이 중단되었지만 사용할 수없는 워크 플로 만 다시 가져 오는 문제가 있습니다. 나는 어딘가에 갇혀 있고 어디를 보지 못한다.

내가로드 워크 플로우 I는 다음과 같이로드 : 이것은 좋은 모습

WorkflowApplication wf2App = new WorkflowApplication(new WorkflowInstanceStoreTestsSimplePersistence()); 
wf2App.InstanceStore = store; 
wf2App.Load(wfApp.Id); 

- 내가 다시 워크 플로를 얻을. 나는 핸들러를 연결하고 Run()을 할 때 ... ...

... 중단.

이유는 :

현재 작업 항목을 처리하는 중에 오류가 흐름이 중단 발생했다. 자세한 내용은 내부 예외를 참조하십시오.

내부 예외이다 : {스키마 - 마이크로 소프트의 COM : System.Activities.Persistence/명령 URN} SaveWorkflow InstanceStore의

지속성 공급자 이행 명령 명명을 지원하지 않는다. 다른 제공 업체를 선택하거나이 지속성 명령이 시도되지 않았습니다 ( ).

실제 문제는 제 구현에서이를 볼 수 없다는 것입니다. 나는 단순히 오류를 반환하지 않으며 오류없이 명령 핸들러에 대한 모든 호출이 반환됩니다.

스택 추적 중 helpfull되지 않습니다

at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at System.Runtime.DurableInstancing.InstancePersistenceContext.ExecuteAsyncResult.End(IAsyncResult result) 
    at System.Runtime.DurableInstancing.InstancePersistenceContext.EndOuterExecute(IAsyncResult result) 
    at System.Runtime.DurableInstancing.InstanceStore.EndExecute(IAsyncResult result) 
    at System.Activities.WorkflowApplication.PersistenceManager.EndSave(IAsyncResult result) 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.OnPersisted(IAsyncResult result) 
    at System.Runtime.AsyncResult.SyncContinue(IAsyncResult result) 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.Persist() 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.CollectAndMap() 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.Track() 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.EnsureProviderReadyness() 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.InitializeProvider() 
    at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult..ctor(WorkflowApplication instance, TimeSpan timeout, PersistenceOperation operation, Boolean isWorkflowThread, Boolean isInternalPersist, AsyncCallback callback, Object state) 
    at System.Activities.WorkflowApplication.BeginInternalPersist(PersistenceOperation operation, TimeSpan timeout, Boolean isInternalPersist, AsyncCallback callback, Object state) 
    at System.Activities.WorkflowApplication.OnBeginPersist(AsyncCallback callback, Object state) 
    at System.Activities.Runtime.ActivityExecutor.PersistenceWaiter.PersistWorkItem.Execute(ActivityExecutor executor, BookmarkManager bookmarkManager) 

내 모든 명령 작업은 TryCommand에 대한 InstanceStore 재정에 있고 그것은 단지 오류없이 작동합니다.

무효 프로

cessSaveWorkflow (InstancePersistenceContext context, SaveWorkflowCommand command) 
     { 
      if (command.CompleteInstance) 
      { 
       DataStore.DeleteInstance(context.InstanceView.InstanceId); 
       DataStore.DeleteInstanceAssociation(context.InstanceView.InstanceId); 
       return; 
      } 

      if (command.InstanceData.Count > 0 || command.InstanceKeyMetadataChanges.Count > 0) 
      { 
       if (!DataStore.SaveAllInstanceData(context.InstanceView.InstanceId, command)) 
       { 
        DataStore.SaveAllInstanceMetaData(context.InstanceView.InstanceId, command); 
       } 
       if (command.InstanceKeysToAssociate.Count > 0) 
       { 
        foreach (var entry in command.InstanceKeysToAssociate) 
        { 
         DataStore.SaveInstanceAssociation(context.InstanceView.InstanceId, entry.Key, false); 
        } 
       } 
       return; 
      } 
     } 

과 문제 (내가 여기에 게시하지 않습니다 jsut 데이터 저장소 호출)없이 작동 :

SaveWorkflowCommand의 핸들러입니다.

나는 hinking을 시작합니다. ok 상태를 설정하는 것을 잊어 버릴 수도 있지만, Pro WF (4.0) (책)의 예제를 따르고 작동하지 않습니다.

누구나 아이디어가 있으십니까? 이,

+0

저는 InstanceStore 구현에 그다지 중요하지 않습니다.이미이 [샘플] (http://www.microsoft.com/download/en/details.aspx?id=21459)를 보았습니까? – Joao

+0

구체적으로 * WF \ Application \ PurchaseProcess \ CodedWorkflow \ CS \ WfDefinition *에있는 * XmlWorkflowInstanceStore *. 어딘가에서 어떤 전화가 누락 된 것 같습니다. – Joao

답변

2

WF4 사용자 정의 인스턴스 저장소를 작성하는 매우 까다로운 일이하고 시작하는 가장 쉬운 방법이 유용하다 Jota이 언급 한 샘플, 게다가

:-(아주 작은 문서는 아니지만 문서 here을 잘 살펴보고 if (command is SaveWorkflowCommand)과 같은 코드로 명령을 확인하고 마지막으로 new CompletedAsyncResult<bool>(true, callback, state을 반환하는 방식으로 XmlWorkflowInstanceStore.BeginTryCommand()을 살펴보십시오.