簡體   English   中英

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

[英]Resuming persisted WorkFlow (WorkFlow Foundation 4.5)

我試圖恢復持續的工作流程。 工作流在客戶端計算機上本地運行,並附加到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或者我做錯了什么? 目前它真的令人沮喪因為我無法處理這個問題。 提前致謝

問題是你是先做Run然后恢復:

wfApp.Run();

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

要恢復書簽,只需要ResumeBookmark。 只需刪除wfApp.Run(); 它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM