Исключение из хранилища рабочих процессов WWF
У нас есть система, которая использует "WWF" в качестве механизма рабочего процесса, и запросы на продолжение рабочего процесса часто не выполняются, и журнал заполняется этим исключением.
System.Runtime.DurableInstancing.InstancePersistenceException: Блокировка SqlWorkflowInstanceStore не существует в базе данных. Это могло произойти из-за того, что SQL Server занят или из-за временной потери соединения.
и это срабатывает в этом event (application.Aborted = (e) =>{})
Любые идеи о том, как решить эту проблему?
Вот как я загружаю рабочий процесс и снимаю блокировку
//Create an instance of the workflow and its application and associate with workflow application.
Activity workflow = Activator.CreateInstance(workflowType) as Activity;
WorkflowApplication application = new WorkflowApplication(workflow);
application.SynchronizationContext = SyncSynchronizationContext.SingletonInstance;
//Hold the workflow store
application.InstanceStore = CreateInstanceStore(WorkflowDatabaseConnectionString);
var instanceHandle = application.InstanceStore.CreateInstanceHandle(guid);
var ownerCommand = new CreateWorkflowOwnerCommand();
var view = application.InstanceStore.Execute(instanceHandle, ownerCommand, TimeSpan.FromDays(30));
application.InstanceStore.DefaultInstanceOwner = view.InstanceOwner;
// Do whatever needs to be dome with multiple WorkflowApplications
if (pParticipant != null)
application.Extensions.Add(pParticipant);
//Register workflow application services from the external world
ExternalRegisteredServices.ForEach(service => application.Extensions.Add(service));
ReadOnlyCollection<BookmarkInfo> currentBookmarks = null;
Dictionary<string, object> wfContextBag = null;
application.PersistableIdle = (workflowApplicationIdleEventArgs) =>
{
currentBookmarks = workflowApplicationIdleEventArgs.Bookmarks;
wfContextBag = workflowApplicationIdleEventArgs
.GetInstanceExtensions<WorkflowContext>()
.First()
.GetBag();
return PersistableIdleAction.Unload;
};
application.OnUnhandledException = (e) =>
{
if (wfUnhandledExceptionEventHandler != null)
wfUnhandledExceptionEventHandler(e);
return UnhandledExceptionAction.Abort;
};
application.Aborted = (e) =>
{
if (wfAbortedEventHandler != null)
wfAbortedEventHandler(e);
};
application.Completed = (e) =>
{
if (wfCompletedEventHandler != null)
wfCompletedEventHandler(e);
};
application.Load(guid);
BookmarkResumptionResult resumptionResult = BookmarkResumptionResult.NotFound;
if (!string.IsNullOrEmpty(bookmarkName))
resumptionResult = application.ResumeBookmark(bookmarkName, null);
if (resumptionResult != BookmarkResumptionResult.Success)
currentBookmarks = application.GetBookmarks();
var deleteOwnerCommand = new DeleteWorkflowOwnerCommand();
application.InstanceStore.Execute(instanceHandle, deleteOwnerCommand, TimeSpan.FromSeconds(30));
instanceHandle.Free();
1 ответ
Вы можете попробовать использовать application.Unload(), это поможет вам решить ваше исключение Abort. По умолчанию операция выгрузки должна завершиться за 30 секунд. Однако, если этого не происходит, срабатывает событие Abort.