2013-03-25 52 views
1

我试图恢复持续工作流程。工作流运行在客户机上的本地和附加到WindowsForms应用恢复持续工作流程(WorkFlow Foundation 4.5)

书签是在扩展活动创造喜欢这里:

/// <summary> 
    /// Will be executed if the bookmark gets executed. 
    /// </summary> 
    protected override void Execute(NativeActivityContext context) 
    { 
     ScanBarcodeExtension requestToScanBarcode = context.GetExtension<ScanBarcodeExtension>(); 
     requestToScanBarcode.GetScanResult(UserMessage.Get(context), BookmarkName.Get(context), ExpectedScanActivity.Get(context)); 
     context.CreateBookmark(BookmarkName.Get(context), new BookmarkCallback(scanBarcodeCallback)); 
    } 

    /// <summary> 
    /// Scans the magazine barcode callback. 
    /// </summary> 
    /// <param name="context">The context.</param> 
    /// <param name="bookmark">The bookmark.</param> 
    /// <param name="value">The value.</param> 
    private void scanBarcodeCallback(NativeActivityContext context, Bookmark bookmark, object value) 
    { 
     WorkflowArgumentContainer container = context.GetValue(this.ArgumentContainer); 
     switch ((ScanActivity)ExpectedScanActivity.Get(context)) 
     { 
      case ScanActivity.FAUF: 
       container.FaufId = (value as string); 
       break; 
      case ScanActivity.Magazine: 
       container.CurrentMagazine.ID = (value as string); 
       break; 
      case ScanActivity.AluPack: 
       container.PrintAluPackLabelProcessResult.ScannedLabelContent = (value as string); 
       break; 
      case ScanActivity.Box: 
       container.PrintBoxLabelProcessResult.ScannedLabelContent = (value as string); 
       break; 
      default: 
       break; 
     } 

     Result.Set(context, container); 
    } 

当我打电话

wfApp.ResumeBookmark(bookmarkName, value); 

从运行应用程序,一切工作正常。

现在我关闭应用程序,做了以下几件事:

  • 检查设置SQL表中现有的ID
  • 获取ID
  • 配置工作流程
  • 试图恢复书签

看起来像这样:

logger.Info("Persisted workflow found. Loading workflow states..."); 
     WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(this.workflowInstanceId, sqlStore); 
     WorkflowApplication wfApp = new WorkflowApplication(new ConditioningWF(), instance.DefinitionIdentity); 

     logger.Info("Configuring persisted workflow..."); 
     this.configureWorkflowApplication(wfApp); 

     wfApp.Load(instance); 
     logger.Info("Getting blocking bookmarks from persisted workflow..."); 
     string bookmark = this.getBlockingBookmarksFromPersistedWorkFlow(wfApp.Id); 
     if (string.IsNullOrEmpty(bookmark)) 
      throw new MissingArgumentExceptions(string.Format("Kein Bookmark für den persistierten WorkFlow mit der ID '{0}' gefunden!", wfApp.Id)); 

     logger.Info("Running persisted workflow..."); 
     wfApp.Run(); 

     logger.InfoFormat("Resuming bookmark '{0}'...", bookmark); 
     wfApp.ResumeBookmark("ScanMagazine", string.Empty); 

configureWorkFlowApplication的实施看起来是这样的:

private void configureWorkflowApplication(WorkflowApplication wfApp) 
    { 
     // Configure the persistence store. 
     wfApp.InstanceStore = sqlStore; 

     // Instance the extensions... 
     MESWebserviceExtension mesDataAccessExtension = new MESWebserviceExtension(); 
     ExceptionNotificationExtension exceptionNotifiyExtension = new ExceptionNotificationExtension(); 
     ScanBarcodeExtension scanBarcodeExtension = new ScanBarcodeExtension(); 
     NotifyFaufRegisteredExtension notifyFaufRegisteredExtension = new NotifyFaufRegisteredExtension(); 
     FuseAluPackExtension fuseAluPackExtension = new FuseAluPackExtension(); 

     exceptionNotifiyExtension.OnNotifiyException += exceptionNotifiyExtension_OnNotifiyException; 
     scanBarcodeExtension.OnGetFaufScan += scanBarcodeExtension_OnGetFaufScan; 
     notifyFaufRegisteredExtension.OnFaufRegistered += notifyFaufRegisteredExtension_OnFaufRegistered; 
     scanBarcodeExtension.OnGetMagazinScan += scanBarcodeExtension_OnGetMagazinScan; 
     fuseAluPackExtension.OnGetFuseResult += fuseAluPackExtension_OnGetFuseResult; 


     //...add extensions 
     wfApp.Extensions.Add(exceptionNotifiyExtension); 
     wfApp.Extensions.Add(mesDataAccessExtension); 

     wfApp.Extensions.Add(notifyFaufRegisteredExtension); 
     wfApp.Extensions.Add(scanBarcodeExtension); 
     wfApp.Extensions.Add(fuseAluPackExtension); 

     #region WF States changed 
     wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) 
     { 
      if (e.CompletionState == ActivityInstanceState.Faulted) 
      { 
       logger.Error(String.Format("...Workflow '{0}' terminated: {1}", e.InstanceId, e.TerminationException.Message), e.TerminationException); 

       if (System.Diagnostics.Debugger.IsAttached) 
       { 
        MboxStatus(string.Format("Workflow Terminated. Exception: {0}\r\n{1}", 
         e.TerminationException.GetType().FullName, 
         e.TerminationException.Message)); 
       } 
      } 
      else if (e.CompletionState == ActivityInstanceState.Canceled) 
      { 

       logger.WarnFormat("...Workflow '{0}' canceled...", e.InstanceId); 

       if (System.Diagnostics.Debugger.IsAttached) 
       { 
        MboxStatus("Workflow Canceled."); 
       } 
      } 
      else 
      { 
       logger.WarnFormat("...Workflow '{0}' completed...", e.InstanceId); 

       if (System.Diagnostics.Debugger.IsAttached) 
       { 
        MboxStatus("Fertig"); 
       } 
      } 
     }; 

     wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) 
     { 
      logger.Error(String.Format("...Workflow '{0}' aborted '{0}' : {1}", 
        e.InstanceId, e.Reason.Message), e.Reason); 


      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       MboxStatus(string.Format("Workflow Aborted. Exception: {0}\r\n{1}", 
         e.Reason.GetType().FullName, 
         e.Reason.Message)); 
      } 
     }; 

     wfApp.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e) 
     { 
      logger.Error(String.Format("...UnhandledException occured in Workflow '{0}' : {1}", 
            e.InstanceId, e.UnhandledException.Message), e.UnhandledException); 


      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       MboxStatus(string.Format("Unhandled Exception: {0}\r\n{1}", 
         e.UnhandledException.GetType().FullName, 
         e.UnhandledException.Message)); 
      } 
      return UnhandledExceptionAction.Terminate; 
     }; 

     wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) 
     { 
      logger.InfoFormat("...Workflow '{0}' unloaded...", e.InstanceId); 

      return PersistableIdleAction.Unload; 
     }; 

     // Workflow lifecycle events omitted except idle. 
     AutoResetEvent idleEvent = new AutoResetEvent(false); 
     wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) 
     { 
      idleEvent.Set(); 
     }; 
     #endregion 

     logger.Info("...configuring WorkflowApplication finished..."); 
    } 

的问题 调用

wfApp.ResumeBookmark("ScanMagazine", string.Empty); 

后没有任何反应..真的没什么。 我认为该程序应该跳转到scanBarcodeCallback还是我做错了什么?目前它真的令人沮丧因为我不能处理这个问题。 在此先感谢

+0

在msdn论坛中发现以下内容:工作流引擎不需要此数据即可恢复工作流实例。为了将引擎加载工作流实例恢复到内存中,然后尝试恢复书签。所以得到最后的书签是不必要的?!但是,我如何恢复工作流程呢?令人困惑... – 2013-03-26 07:56:56

回答

3

问题是,你正在做的第一次运行,然后恢复:

wfApp.Run();

wfApp.ResumeBookmark("ScanMagazine", string.Empty);

对于恢复书签只需要ResumeBookmark。只要删除wfApp.Run();,它应该工作。

+0

非常感谢!太简单了......永远不要相信MSDN论坛; x – 2013-04-05 12:36:53

相关问题