1

永続的なワークフローを再開しようとしています。ワークフローはクライアントマシンでローカルに実行されており、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にジャンプする必要があると思いますか、それとも何か間違ったことをしていますか?今のところ、これを処理することはできません。前もって感謝します

4

1 に答える 1

3

問題は、最初に実行してから再開することです。

wfApp.Run();

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

ブックマークを再開するには、ResumeBookmarkのみが必要です。削除するだけwfApp.Run();で動作するはずです。

于 2013-04-04T23:28:02.453 に答える