我试图恢复持续的工作流程。工作流在客户端机器上本地运行并附加到 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
- 获取身份证
- 配置工作流程
- 试图恢复书签
这看起来像这样:
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 还是我做错了什么?目前这真的很令人沮丧,因为我无法处理这个。提前致谢