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