Question

Im trying to resume a persisted work flow. The Workflow is running local on a client machine and is attached to a WindowsForms Application

The bookmark is created in a extension activity like here:

 /// <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);
    }

When i call

wfApp.ResumeBookmark(bookmarkName, value);

from a running application, everything works fine.

Now i close the application and doing the following things:

  • Check in the sql table for an existing id
  • getting the ID
  • configuring the workflow
  • trying to resume the bookmark

An this looks like this:

   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);

Implementation of configureWorkFlowApplication looks like this:

 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...");
    }

The Problem After calling

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

Nothing happens.. truly nothing. I think the program should jump to the scanBarcodeCallback or am i doing something wrong? For the moment it is really frustrating cuz i cant handle this. Thanks in advance

Was it helpful?

Solution

Problem is that you are doing first Run then Resume:

wfApp.Run();

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

For resuming bookmarks only ResumeBookmark is needed. Just remove wfApp.Run(); and it should work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top