恢复持久化的WorkFlow(WorkFlow Foundation 4.5)

时间:2013-03-25 16:43:24

标签: c# workflow-foundation workflow-activity

我试图恢复持续的工作流程。工作流在客户端计算机上本地运行,并附加到WindowsForms应用程序

书签是在扩展活动中创建的,例如:

 /// <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或者我做错了什么?目前它真的令人沮丧因为我无法处理这个问题。 提前致谢

1 个答案:

答案 0 :(得分:3)

问题是你先做了Run然后恢复:

wfApp.Run();

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

要恢复书签,只需要ResumeBookmark。只需删除wfApp.Run();即可。