Исключение из хранилища рабочих процессов 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.

Другие вопросы по тегам