Пример #1
0
        private static MySqlInstanceStore CreateInstanceStore(System.Activities.Activity workflow, out InstanceHandle ownerHandle)
        {
            try
            {
                var storeId = new Guid("0bfcc3a5-3c77-421b-b575-73533563a1f3");
                var store   = new MySqlInstanceStore(storeId);
                ownerHandle = store.CreateInstanceHandle();

                var wfHostTypeName = GetWorkflowHostTypeName(workflow);
                var WorkflowHostTypePropertyName = GetWorkflowHostTypePropertyName();

                var ownerCommand = new CreateWorkflowOwnerCommand()
                {
                    InstanceOwnerMetadata = { { WorkflowHostTypePropertyName, new InstanceValue(wfHostTypeName) } }
                };
                var owner = store.Execute(ownerHandle, ownerCommand, TimeSpan.FromSeconds(30)).InstanceOwner;
                ownerHandle.Free();
                store.DefaultInstanceOwner = owner;
                return(store);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 private void MarkInstanceOwnerLost(long surrogateLockOwnerId)
 {
     if (this.SurrogateLockOwnerId == surrogateLockOwnerId)
     {
         this.SurrogateLockOwnerId = -1L;
         InstanceHandle target = this.lockOwnerInstanceHandle.Target as InstanceHandle;
         if (target != null)
         {
             target.Free();
         }
         if (this.sqlWorkflowInstanceStore.IsLockRetryEnabled())
         {
             this.sqlWorkflowInstanceStore.LoadRetryHandler.AbortPendingRetries();
         }
         if (this.LockRenewalTask != null)
         {
             this.LockRenewalTask.CancelTimer();
         }
         if (this.LockRecoveryTask != null)
         {
             this.LockRecoveryTask.CancelTimer();
         }
         if (this.InstanceDetectionTask != null)
         {
             this.InstanceDetectionTask.CancelTimer();
         }
     }
 }
Пример #3
0
        void MarkInstanceOwnerLost(long surrogateLockOwnerId)
        {
            Fx.Assert(this.isBeingModified, "Must have modification lock to mark owner as lost");

            if (this.SurrogateLockOwnerId == surrogateLockOwnerId)
            {
                this.SurrogateLockOwnerId = -1;
                InstanceHandle instanceHandle = this.lockOwnerInstanceHandle.Target as InstanceHandle;
                if (instanceHandle != null)
                {
                    instanceHandle.Free();
                }

                if (this.sqlWorkflowInstanceStore.IsLockRetryEnabled())
                {
                    this.sqlWorkflowInstanceStore.LoadRetryHandler.AbortPendingRetries();
                }

                if (this.LockRenewalTask != null)
                {
                    this.LockRenewalTask.CancelTimer();
                }

                if (this.LockRecoveryTask != null)
                {
                    this.LockRecoveryTask.CancelTimer();
                }

                if (this.InstanceDetectionTask != null)
                {
                    this.InstanceDetectionTask.CancelTimer();
                }
            }
        }
Пример #4
0
        private static SqlWorkflowInstanceStore CreateInstanceStore(WorkflowHandlerBase workflowInstance, out InstanceHandle ownerHandle)
        {
            try
            {
                //WriteDebug("CreateInstanceStore: " + workflowInstance.WorkflowInstanceGuid + ", nodeId: " + workflowInstance.Id);

                var store = new SqlWorkflowInstanceStore(ConnectionString);
                ownerHandle = store.CreateInstanceHandle();

                var wfHostTypeName = GetWorkflowHostTypeName(workflowInstance);
                var WorkflowHostTypePropertyName = GetWorkflowHostTypePropertyName();

                var ownerCommand = new CreateWorkflowOwnerCommand()
                {
                    InstanceOwnerMetadata = { { WorkflowHostTypePropertyName, new InstanceValue(wfHostTypeName) } }
                };
                var owner = store.Execute(ownerHandle, ownerCommand, TimeSpan.FromSeconds(30)).InstanceOwner;
                ownerHandle.Free();
                store.DefaultInstanceOwner = owner;
                return(store);
            }
            catch (Exception e)
            {
                WriteError("CreateInstanceStore", e);
                throw;
            }
        }
        internal static InstanceStore InitializeWorkflowInstanceStore()
        {
            //return new XmlWorkflowInstanceStore();

            string connectionString = ConfigurationManager.ConnectionStrings["wf"].ConnectionString;
            var    store            = new SqlWorkflowInstanceStore(connectionString);

            //TODO: выставить после отладки
            //store.InstanceEncodingOption = InstanceEncodingOption.GZip;

            // про настройки тут: https://msdn.microsoft.com/ru-ru/library/ee395770(v=vs.110).aspx
            store.InstanceLockedExceptionAction    = InstanceLockedExceptionAction.AggressiveRetry;
            store.InstanceCompletionAction         = InstanceCompletionAction.DeleteAll;
            store.HostLockRenewalPeriod            = new TimeSpan(0, 0, 5);
            store.RunnableInstancesDetectionPeriod = new TimeSpan(0, 0, 10);

            InstanceHandle handle = null;

            try
            {
                handle = store.CreateInstanceHandle();
                var view = store.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(5));
                store.DefaultInstanceOwner = view.InstanceOwner;
            }
            finally
            {
                if (handle != null)
                {
                    handle.Free();
                }
            }
            return(store);
        }
Пример #6
0
        /// <summary>
        /// Removes the store owner upon application shut down. This allows another service to recover workflows from other machines.
        /// This should be called from a dispose method in your application
        /// </summary>
        /// <param name="timeout"></param>
        public static void RemoveStoreOwner(TimeSpan timeout)
        {
            var            deleteOwner = new DeleteWorkflowOwnerCommand();
            InstanceHandle handle      = Store.CreateInstanceHandle();

            Store.Execute(handle, deleteOwner, timeout);
            handle.Free();
        }
Пример #7
0
//<Snippet1>
        static void SetupInstanceStore()
        {
            instanceStore =
                new SqlWorkflowInstanceStore(@"Data Source=.\SQLEXPRESS;Initial Catalog=SampleInstanceStore;Integrated Security=True;Asynchronous Processing=True");
            InstanceHandle handle = instanceStore.CreateInstanceHandle();
            InstanceView   view   = instanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));

            handle.Free();
            instanceStore.DefaultInstanceOwner = view.InstanceOwner;
        }
Пример #8
0
 private static void DeleteInstanceStoreOwner()
 {
     try
     {
         InstanceHandle handle = instanceStore.CreateInstanceHandle();
         InstanceView   view   = instanceStore.Execute(handle, new DeleteWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
         handle.Free();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
Пример #9
0
        public WorkflowInstance LoadWorkflow(Guid instanceId)
        {
            var instance = this._repository.LoadWorkflowInstance(instanceId);
            var activity = Helpers.LoadWorkflowActiovityFromXaml(this._workflowRepositoryPath + instance.WorkflowName, this._errorLogger);

            if (activity != null)
            {
                WorkflowApplication app = new WorkflowApplication(activity);
                app.Extensions.Add(() =>
                {
                    SQLTrackingPaticipant participant = new SQLTrackingPaticipant();
                    participant.ConnectionString      = _connectionString;
                    participant.TrackingProfile       = CreateTrackingProfile();
                    return(participant);
                });
                if (this._isPersistable)
                {
                    //setup persistence
                    InstanceStore store = new SqlWorkflowInstanceStore(
                        this._connectionString);
                    InstanceHandle handle = store.CreateInstanceHandle();
                    InstanceView   view   = store.Execute(handle,
                                                          new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
                    handle.Free();
                    store.DefaultInstanceOwner = view.InstanceOwner;
                    app.InstanceStore          = store;
                    app.PersistableIdle        = (e) => { return(PersistableIdleAction.Persist); };
                }
                try
                {
                    app.Load(instanceId);
                    app.Run();

                    instance.SetApplicationhost(app);
                    instance.SetWorkflowInstanceHandeler(this);

                    instance.State      = InstanceState.Loaded;
                    instance.InstanceId = instanceId;
                    this._managedWorkflows.Add(instance);
                    this._repository.UpdateWorkflowInstanceState(app.Id, InstanceState.Loaded, instance.Bookmarks.ConvertStringListToCommaSeparatedString());

                    return(instance);
                }
                catch (Exception ex)
                {
                    this._errorLogger.Log(ex.Message, LoggerInfoTypes.Error);
                }
            }
            return(null);
        }
Пример #10
0
        private static InstanceOwner CreateWorkflowInstanceOwner(InstanceStore store)
        {
            InstanceHandle handle = null;

            try
            {
                handle = store.CreateInstanceHandle();
                return(CreateWorkflowInstanceOwner(store, handle));
            }
            finally
            {
                handle?.Free();
            }
        }
Пример #11
0
        private static void DeleteWorkflowInstanceOwner(InstanceStore store, InstanceOwner owner, Guid instanceId)
        {
            InstanceHandle handle = null;

            var command = new DeleteWorkflowOwnerCommand();

            try
            {
                handle = store.CreateInstanceHandle(owner, instanceId);
                store.Execute(handle, command, TimeSpan.FromMinutes(1.0));
                store.DefaultInstanceOwner = null;
            }
            finally
            {
                handle?.Free();
            }
        }
Пример #12
0
        public static InstanceStore SetupInstanceStore()
        {
            //***********Important Notice*************
            //You need to modify the following line of code before running the sample.
            //Replace the value of myConnectionString with the value of the "Connection String" property
            //of the WorkflowInstanceStore database on your own machine.
            string        myConnectionString = @"Data Source=localhost;Initial Catalog=PersistenceDB;Integrated Security=True";
            InstanceStore instanceStore      = new SqlWorkflowInstanceStore(myConnectionString);

            InstanceHandle handle = instanceStore.CreateInstanceHandle();
            InstanceView   view   = instanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));

            handle.Free();

            instanceStore.DefaultInstanceOwner = view.InstanceOwner;

            return(instanceStore);
        }
Пример #13
0
        public Guid NewWorkFlow(string workflowName, IDictionary <string, object> parameters)
        {
            var activity = Helpers.LoadWorkflowActiovityFromXaml(this._workflowRepositoryPath + workflowName, this._errorLogger);

            if (activity != null)
            {
                WorkflowApplication app = new WorkflowApplication(activity, parameters);
                app.Extensions.Add(() =>
                {
                    SQLTrackingPaticipant participant = new SQLTrackingPaticipant();
                    participant.ConnectionString      = _connectionString;
                    return(participant);
                });

                if (this._isPersistable)
                {
                    //setup persistence
                    InstanceStore store = new SqlWorkflowInstanceStore(
                        this._connectionString);
                    InstanceHandle handle = store.CreateInstanceHandle();
                    InstanceView   view   = store.Execute(handle,
                                                          new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
                    handle.Free();
                    store.DefaultInstanceOwner = view.InstanceOwner;
                    app.InstanceStore          = store;
                    app.PersistableIdle        = (e) => { return(PersistableIdleAction.Unload); };
                }
                try
                {
                    app.Run();
                    var wfinstance = new WorkflowInstance(workflowName, this, app);
                    wfinstance.State      = InstanceState.Created;
                    wfinstance.InstanceId = app.Id;
                    this._managedWorkflows.Add(wfinstance);
                    this._repository.SaveWorkflowInstanceState(app.Id, workflowName, InstanceState.Created, string.Empty);
                    return(app.Id);
                }
                catch (Exception ex)
                {
                    this._errorLogger.Log(ex.Message, LoggerInfoTypes.Error);
                }
            }
            return(Guid.Empty);
        }
        private static InstanceStore CreateInstanceStore()
        {
            var store = new SqlWorkflowInstanceStore(FrameworkEnvironment.Instance.Configuration.GetConnectionString())
            {
                InstanceEncodingOption           = InstanceEncodingOption.GZip,
                RunnableInstancesDetectionPeriod = TimeSpan.FromSeconds(10),
                HostLockRenewalPeriod            = TimeSpan.FromSeconds(10),
                InstanceCompletionAction         = InstanceCompletionAction.DeleteNothing,
                InstanceLockedExceptionAction    = InstanceLockedExceptionAction.AggressiveRetry
            };

            HostTypeName = XName.Get(Name, typeof(WorkflowInstanceService).FullName ?? string.Empty);

            Handle = CreateOwnerHandle(store);

            //store.Execute(Handle, new DeleteWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
            Handle.Free();
            return(store);
        }
Пример #15
0
        private static void SetupInstanceStore()
        {
            try
            {
                instanceStore =
                    new SqlWorkflowInstanceStore(ConfigurationManager.ConnectionStrings["WFConnection"].ToString());
                instanceStore.InstanceCompletionAction = InstanceCompletionAction.DeleteNothing;

                InstanceHandle handle = instanceStore.CreateInstanceHandle();
                InstanceView   view   = instanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
                handle.Free();

                instanceStore.DefaultInstanceOwner = view.InstanceOwner;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Пример #16
0
        SqlWorkflowInstanceStore CreateInstanceStore(String cnnString)
        {
            String cnnStr = cnnString;

            if (cnnStr.IndexOf("Asynchronous Processing") == -1)
            {
                cnnStr += ";Asynchronous Processing=True";
            }
            var _store = new SqlWorkflowInstanceStore(cnnStr)
            {
                InstanceLockedExceptionAction    = InstanceLockedExceptionAction.AggressiveRetry,
                HostLockRenewalPeriod            = _wfTimeSpan,
                RunnableInstancesDetectionPeriod = TimeSpan.FromSeconds(RUNNABLE_INSTANCES_DETECTION_PERIOD),
                InstanceCompletionAction         = InstanceCompletionAction.DeleteNothing
            };
            InstanceHandle handle = _store.CreateInstanceHandle();
            InstanceView   view   = _store.Execute(handle, new CreateWorkflowOwnerCommand(), _wfTimeSpan);

            _store.DefaultInstanceOwner = view.InstanceOwner;
            handle.Free();
            return(_store);
        }
Пример #17
0
        private static SqlWorkflowInstanceStore CreateInstanceStore(System.Activities.Activity workflow, out InstanceHandle ownerHandle)
        {
            try
            {
                var store = new SqlWorkflowInstanceStore(ConnectionString);
                ownerHandle = store.CreateInstanceHandle();

                var wfHostTypeName = GetWorkflowHostTypeName(workflow);
                var WorkflowHostTypePropertyName = GetWorkflowHostTypePropertyName();

                var ownerCommand = new CreateWorkflowOwnerCommand()
                {
                    InstanceOwnerMetadata = { { WorkflowHostTypePropertyName, new InstanceValue(wfHostTypeName) } }
                };
                var owner = store.Execute(ownerHandle, ownerCommand, TimeSpan.FromSeconds(30)).InstanceOwner;
                ownerHandle.Free();
                store.DefaultInstanceOwner = owner;
                return(store);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        static void Main(string[] args)
        {
            // create the workflow app and add handlers for the Idle and Completed actions
            WorkflowApplication app = new WorkflowApplication(new Sequence1());

            //setup persistence
            InstanceStore  store  = new SqlWorkflowInstanceStore(@"Data Source=.\SQLEXPRESS;Initial Catalog=WF45GettingStartedTutorial;Integrated Security=True");
            InstanceHandle handle = store.CreateInstanceHandle();
            InstanceView   view   = store.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));

            handle.Free();
            store.DefaultInstanceOwner = view.InstanceOwner;
            app.InstanceStore          = store;


            app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
            {
                syncEvent.Set();
                return(PersistableIdleAction.Unload);
            };

            app.Unloaded = delegate(WorkflowApplicationEventArgs e)
            {
                syncEvent.Set();
            };

            app.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                Console.WriteLine("Workflow {0} Completed.", e.InstanceId);
                syncEvent.Set();
            };

            // start the application
            id = app.Id;
            app.Run();
            syncEvent.WaitOne();

            // resume bookmark 1
            string text = Console.ReadLine();

            app = new WorkflowApplication(new Sequence1());
            app.InstanceStore = store;

            app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
            {
                syncEvent.Set();
                return(PersistableIdleAction.Unload);
            };

            app.Completed = (workflowApplicationCompletedEventArgs) =>
            {
                Console.WriteLine("WF Bookmark1 has Completed in the {0} state.",
                                  workflowApplicationCompletedEventArgs.CompletionState);
                syncEvent.Set();
            };
            app.Unloaded = (workflowApplicationEventArgs) =>
            {
                Console.WriteLine("WF Bookmark1 unloaded");
                syncEvent.Set();
            };

            app.Load(id);
            app.ResumeBookmark("readText", text);
            syncEvent.WaitOne();

            // resume bookmark 2
            int number = ReadNumberFromConsole();

            app = new WorkflowApplication(new Sequence1());
            app.InstanceStore = store;
            app.Completed     = (workflowApplicationCompletedEventArgs) =>
            {
                Console.WriteLine("WF Bookmark2 has Completed in the {0} state.",
                                  workflowApplicationCompletedEventArgs.CompletionState);
                syncEvent.Set();
            };
            app.Unloaded = (workflowApplicationEventArgs) =>
            {
                Console.WriteLine("WF Bookmark1 unloaded");
                syncEvent.Set();
            };

            app.Load(id);
            app.ResumeBookmark("readNumber", number);
            syncEvent.WaitOne();

            Console.WriteLine("");
            Console.WriteLine("Press [ENTER] to exit...");
            Console.ReadLine();
        }
Пример #19
0
 public void Dispose()
 {
     this.Execute(_handle, new DeleteWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
     _handle.Free();
 }
Пример #20
0
        public WorkflowService(
            IUsersService users

            )
        {
            _users = users;
            T      = NullLocalizer.Instance;
            Logger = NullLogger.Instance;
            SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(_users.ApplicationConnectionString);

            _wfApp = new WorkflowApplication(new NKD.Workflow.AssignMetadata());
            _wfApp.InstanceStore = store;

            XName wfHostTypeName = XName.Get("NKD", _users.ApplicationID.ToString());
            Dictionary <XName, object> wfScope = new Dictionary <XName, object> {
                { workflowHostTypePropertyName, wfHostTypeName }
            };

            _wfApp.AddInitialInstanceValues(wfScope);

            _wfApp.Extensions.Add(new MetadataExtension());
            List <XName> variantProperties = new List <XName>()
            {
                MetadataExtension.xNS.GetName("CompanyID"),
                MetadataExtension.xNS.GetName("ContactID")
            };

            store.Promote("Metadata", variantProperties, null);

            InstanceHandle handle = store.CreateInstanceHandle(null);
            var            cmd    = new CreateWorkflowOwnerCommand
            {
                InstanceOwnerMetadata =
                {
                    { workflowHostTypePropertyName, new InstanceValue(wfHostTypeName) }
                }
            };
            InstanceOwner owner = store.Execute(handle, cmd, TimeSpan.MaxValue).InstanceOwner;

            store.DefaultInstanceOwner = owner;

            handle.Free();

            _wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
            {
                return(PersistableIdleAction.Persist);
            };

            _wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    foreach (var item in e.Outputs)
                    {
                        System.Diagnostics.Debug.WriteLine("Variable:{0} has value: {1}", item.Key, item.Value);
                    }
                }
            };

            var trackingParticipant = new TrackingHelper.DebugTrackingParticipant
            {
                TrackingProfile = TrackingHelper.SimpleProfile
            };

            _wfApp.Extensions.Add(trackingParticipant);
        }