private IAsyncResult CreateWorkflowOwner(InstancePersistenceContext context, CreateWorkflowOwnerCommand command, TimeSpan timeout, AsyncCallback callback, object state)
        {            
            var owner = new LockOwner()
            {
                Id = Guid.NewGuid(),                
            };

            // TODO: map fields into the owner entity
            Debug.WriteLine("CreateWorkflowOwner::InstanceOwnerMetadata: ");
            Debug.Indent();
            foreach (var key in command.InstanceOwnerMetadata.Keys)
            {
                Debug.WriteLine("[{0}]=[{1}]", key, command.InstanceOwnerMetadata[key].Value);
            }            
            Debug.Unindent();
            


            //context.BindInstanceOwner(owner.Id, owner.Id);
            //context.BindEvent(HasRunnableWorkflowEvent.Value);

            //return new CompletedAsyncResult(callback, state);

            return null;
        }
        public WorkflowService(
            IUsersService users

          )
        {
            _users = users;
            T = NullLocalizer.Instance;
            Logger = NullLogger.Instance;
            SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(_users.ApplicationConnectionString);
            _wfApp = new WorkflowApplication(new XODB.Workflow.AssignResponsibility());
            _wfApp.InstanceStore = store;
            
            XName wfHostTypeName = XName.Get("XODB", _users.ApplicationID.ToString());
            Dictionary<XName, object> wfScope = new Dictionary<XName, object> { { workflowHostTypePropertyName, wfHostTypeName } };
            _wfApp.AddInitialInstanceValues(wfScope);
            
            _wfApp.Extensions.Add(new ResponsibilityExtension());
            List<XName> variantProperties = new List<XName>() 
            { 
                ResponsibilityExtension.xNS.GetName("CompanyID"), 
                ResponsibilityExtension.xNS.GetName("ContactID") 
            };
            store.Promote("Responsibility", 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);
        }
 internal DurableInstanceManager(WorkflowServiceHost host)
 {
     this.DurableInstancingOptions = new System.ServiceModel.Activities.DurableInstancingOptions(this);
     this.createOwnerCommand = new CreateWorkflowOwnerCommand();
     this.instanceMetadataChanges = new Dictionary<XName, InstanceValue>();
     this.thisLock = new object();
     InstanceValue value2 = new InstanceValue(XNamespace.Get("http://tempuri.org").GetName("Sentinel"));
     this.createOwnerCommand.InstanceOwnerMetadata.Add(WorkflowNamespace.WorkflowHostType, value2);
     this.instanceMetadataChanges.Add(WorkflowNamespace.WorkflowHostType, value2);
     this.instanceMetadataChanges.Add(PersistenceMetadataNamespace.InstanceType, new InstanceValue(WorkflowNamespace.WorkflowHostType, InstanceValueOptions.WriteOnly));
     this.Host = host;
 }
Exemple #4
0
        // Configure a Default Owner for the instance store so instances can be re-loaded from WorkflowApplication
        private static InstanceHandle CreateInstanceStoreOwner(InstanceStore store, XName wfHostTypeName)
        {
            InstanceHandle ownerHandle = store.CreateInstanceHandle();

            CreateWorkflowOwnerCommand ownerCommand = new CreateWorkflowOwnerCommand()
            {
                InstanceOwnerMetadata =
                {
                    { WorkflowHostTypePropertyName, new InstanceValue(wfHostTypeName) }
                }
            };

            store.DefaultInstanceOwner = store.Execute(ownerHandle, ownerCommand, TimeSpan.FromSeconds(30)).InstanceOwner;

            return ownerHandle;
        }
        IDictionary <XName, InstanceValue> GetCommandMetadata(out bool withIdentity)
        {
            CreateWorkflowOwnerWithIdentityCommand createOwnerWithIdentityCommand = base.InstancePersistenceCommand as CreateWorkflowOwnerWithIdentityCommand;

            if (createOwnerWithIdentityCommand != null)
            {
                withIdentity = true;
                return(createOwnerWithIdentityCommand.InstanceOwnerMetadata);
            }
            else
            {
                CreateWorkflowOwnerCommand createOwnerCommand = (CreateWorkflowOwnerCommand)base.InstancePersistenceCommand;
                withIdentity = false;
                return(createOwnerCommand.InstanceOwnerMetadata);
            }
        }
        private void ExtractWorkflowHostType()
        {
            InstanceValue value2;
            CreateWorkflowOwnerCommand instancePersistenceCommand = (CreateWorkflowOwnerCommand)base.InstancePersistenceCommand;

            if (instancePersistenceCommand.InstanceOwnerMetadata.TryGetValue(WorkflowNamespace.WorkflowHostType, out value2))
            {
                XName name = value2.Value as XName;
                if (name == null)
                {
                    throw FxTrace.Exception.AsError(new InstancePersistenceCommandException(System.Activities.DurableInstancing.SR.InvalidWorkflowHostTypeValue(WorkflowNamespace.WorkflowHostType)));
                }
                byte[] bytes = Encoding.Unicode.GetBytes(name.ToString());
                base.Store.WorkflowHostType     = new Guid(HashHelper.ComputeHash(bytes));
                this.fireRunnableInstancesEvent = true;
            }
        }
Exemple #7
0
        static InstanceStore CreateInstanceStore()
        {
            string connectionString = ConfigurationManager.ConnectionStrings["InstanceStore"].ConnectionString;
            var instanceStore = new SqlWorkflowInstanceStore(connectionString);
            var instanceHandle = instanceStore.CreateInstanceHandle();
            var ownerCommand = new CreateWorkflowOwnerCommand();
            XNamespace hostNamespace = XNamespace.Get("urn:schemas-microsoft-com:System.Activities/4.0/properties");
            XName hostKey = hostNamespace.GetName("WorkflowHostType");
            var hostValue = new InstanceValue(XNamespace.Get("http://tempuri.org").GetName("SampleInstance"));
            ownerCommand.InstanceOwnerMetadata.Add(hostKey, hostValue);
            instanceStore.DefaultInstanceOwner = instanceStore.Execute(
                               instanceHandle,
                               ownerCommand,
                               TimeSpan.FromSeconds(30)).InstanceOwner;
            instanceHandle.Free();

            return instanceStore;
        }
        public virtual void SetDefaultWorkflowInstanceOwner(XName workflowHostTypeName, IEnumerable<WorkflowIdentity> workflowIdentities)
        {
            if (Store.DefaultInstanceOwner == null || (_ownerInstanceHandle == null || _ownerInstanceHandle.IsValid == false))
            {
                lock (_syncLock)
                {
                    if (Store.DefaultInstanceOwner == null ||
                        (_ownerInstanceHandle == null || _ownerInstanceHandle.IsValid == false))
                    {
                        _workflowHostTypeName = workflowHostTypeName;
                        _workflowIdentities = workflowIdentities;
                        TryRenewInstanceHandle(ref _ownerInstanceHandle);

                        InstancePersistenceCommand createOwnerCmd = null;                        
#if NET4
                        createOwnerCmd = new CreateWorkflowOwnerCommand();
                        ((CreateWorkflowOwnerCommand)createOwnerCmd).InstanceOwnerMetadata.Add(WorkflowNamespaces.WorkflowHostTypePropertyName, new InstanceValue(workflowHostTypeName));
#else
                        if (workflowIdentities == null)
                        {
                            createOwnerCmd = new CreateWorkflowOwnerCommand();
                            ((CreateWorkflowOwnerCommand) createOwnerCmd).InstanceOwnerMetadata.Add(WorkflowNamespaces.WorkflowHostTypePropertyName, new InstanceValue(workflowHostTypeName));
                        }
                        else
                        {
                            // support workflow versioning
                            createOwnerCmd = new CreateWorkflowOwnerWithIdentityCommand();
                            ((CreateWorkflowOwnerWithIdentityCommand)createOwnerCmd).InstanceOwnerMetadata.Add(WorkflowNamespaces.WorkflowHostTypePropertyName, new InstanceValue(workflowHostTypeName));
                            ((CreateWorkflowOwnerWithIdentityCommand)createOwnerCmd).InstanceOwnerMetadata.Add(WorkflowNamespaces.DefinitionIdentityFilterName, new InstanceValue(WorkflowIdentityFilter.Any));
                            ((CreateWorkflowOwnerWithIdentityCommand)createOwnerCmd).InstanceOwnerMetadata.Add(WorkflowNamespaces.DefinitionIdentitiesName, new InstanceValue(workflowIdentities.ToList()));
                        }                                                                   
#endif
                        Store.DefaultInstanceOwner = ExecuteCommand(createOwnerCmd, DefaultTimeout).InstanceOwner;
                    }

                }
            }
        }
        InstancePersistenceCommand GetCreateOwnerCommand()
        {
            InstancePersistenceCommand command;
            IDictionary<XName, InstanceValue> commandMetadata;
            if (this.instanceOwnerMetadata.ContainsKey(Workflow45Namespace.DefinitionIdentities))
            {
                CreateWorkflowOwnerWithIdentityCommand withIdentity = new CreateWorkflowOwnerWithIdentityCommand();
                command = withIdentity;
                commandMetadata = withIdentity.InstanceOwnerMetadata;
            }
            else
            {
                CreateWorkflowOwnerCommand withoutIdentity = new CreateWorkflowOwnerCommand();
                command = withoutIdentity;
                commandMetadata = withoutIdentity.InstanceOwnerMetadata;
            }

            foreach (KeyValuePair<XName, InstanceValue> metadata in this.instanceOwnerMetadata)
            {
                commandMetadata.Add(metadata);
            }

            return command;
        }
Exemple #10
0
 private bool CreateWorkflowOwner(InstancePersistenceContext context, CreateWorkflowOwnerCommand command)
 {
     Guid instanceOwnerId = Guid.NewGuid();
     context.BindInstanceOwner(instanceOwnerId, instanceOwnerId);
     context.BindEvent(HasRunnableWorkflowEvent.Value);
     return true;
 }
        public void Open()
        {
            this.instanceStore = new SqlWorkflowInstanceStore(connectionString);

            CreateWorkflowOwnerCommand createWorkflowOwnerCommand = new CreateWorkflowOwnerCommand();
            InstanceHandle handle = this.instanceStore.CreateInstanceHandle();

            try
            {
                this.instanceStore.BeginExecute(handle, createWorkflowOwnerCommand, TimeSpan.FromSeconds(30), OnInstanceStoreEndExecute, null);
            }
            catch (InstancePersistenceException persistenceException)
            {
                WriteException(persistenceException, "An error has occured setting up the InstanceStore");
            }
        }
        protected override void GenerateSqlCommand(SqlCommand sqlCommand)
        {
            InstanceValue value2;

            base.GenerateSqlCommand(sqlCommand);
            if (base.StoreLock.IsValid)
            {
                throw FxTrace.Exception.AsError(new InstancePersistenceCommandException(System.Activities.DurableInstancing.SR.MultipleLockOwnersNotSupported));
            }
            CreateWorkflowOwnerCommand instancePersistenceCommand = base.InstancePersistenceCommand as CreateWorkflowOwnerCommand;
            SqlParameterCollection     parameters = sqlCommand.Parameters;
            double totalSeconds = base.Store.BufferedHostLockRenewalPeriod.TotalSeconds;

            this.lockOwnerId = Guid.NewGuid();
            this.ExtractWorkflowHostType();
            if (instancePersistenceCommand.InstanceOwnerMetadata.TryGetValue(PersistenceMetadataNamespace.ActivationType, out value2))
            {
                if (!PersistenceMetadataNamespace.ActivationTypes.WAS.Equals(value2.Value))
                {
                    throw FxTrace.Exception.AsError(new InstancePersistenceCommandException(System.Activities.DurableInstancing.SR.NonWASActivationNotSupported));
                }
                this.fireActivatableInstancesEvent = true;
            }
            ArraySegment <byte>[] segmentArray = SerializationUtilities.SerializePropertyBag(instancePersistenceCommand.InstanceOwnerMetadata, base.Store.InstanceEncodingOption);
            SqlParameter          parameter    = new SqlParameter {
                ParameterName = "@lockTimeout",
                SqlDbType     = SqlDbType.Int,
                Value         = totalSeconds
            };

            parameters.Add(parameter);
            SqlParameter parameter2 = new SqlParameter {
                ParameterName = "@lockOwnerId",
                SqlDbType     = SqlDbType.UniqueIdentifier,
                Value         = this.lockOwnerId
            };

            parameters.Add(parameter2);
            SqlParameter parameter3 = new SqlParameter {
                ParameterName = "@workflowHostType",
                SqlDbType     = SqlDbType.UniqueIdentifier,
                Value         = (base.Store.WorkflowHostType != Guid.Empty) ? ((object)base.Store.WorkflowHostType) : ((object)DBNull.Value)
            };

            parameters.Add(parameter3);
            SqlParameter parameter4 = new SqlParameter {
                ParameterName = "@enqueueCommand",
                SqlDbType     = SqlDbType.Bit,
                Value         = base.Store.EnqueueRunCommands
            };

            parameters.Add(parameter4);
            SqlParameter parameter5 = new SqlParameter {
                ParameterName = "@deleteInstanceOnCompletion",
                SqlDbType     = SqlDbType.Bit,
                Value         = base.Store.InstanceCompletionAction == InstanceCompletionAction.DeleteAll
            };

            parameters.Add(parameter5);
            SqlParameter parameter6 = new SqlParameter {
                ParameterName = "@primitiveLockOwnerData",
                SqlDbType     = SqlDbType.VarBinary,
                Size          = segmentArray[0].Count,
                Value         = segmentArray[0].Array ?? DBNull.Value
            };

            parameters.Add(parameter6);
            SqlParameter parameter7 = new SqlParameter {
                ParameterName = "@complexLockOwnerData",
                SqlDbType     = SqlDbType.VarBinary,
                Size          = segmentArray[1].Count,
                Value         = segmentArray[1].Array ?? DBNull.Value
            };

            parameters.Add(parameter7);
            SqlParameter parameter8 = new SqlParameter {
                ParameterName = "@writeOnlyPrimitiveLockOwnerData",
                SqlDbType     = SqlDbType.VarBinary,
                Size          = segmentArray[2].Count,
                Value         = segmentArray[2].Array ?? DBNull.Value
            };

            parameters.Add(parameter8);
            SqlParameter parameter9 = new SqlParameter {
                ParameterName = "@writeOnlyComplexLockOwnerData",
                SqlDbType     = SqlDbType.VarBinary,
                Size          = segmentArray[3].Count,
                Value         = segmentArray[3].Array ?? DBNull.Value
            };

            parameters.Add(parameter9);
            SqlParameter parameter10 = new SqlParameter {
                ParameterName = "@encodingOption",
                SqlDbType     = SqlDbType.TinyInt,
                Value         = base.Store.InstanceEncodingOption
            };

            parameters.Add(parameter10);
            SqlParameter parameter11 = new SqlParameter {
                ParameterName = "@machineName",
                SqlDbType     = SqlDbType.NVarChar,
                Value         = SqlWorkflowInstanceStoreConstants.MachineName
            };

            parameters.Add(parameter11);
        }
        private Exception ProcessCreateWorkflowOwner(
            InstancePersistenceContext context,
            // ReSharper disable UnusedParameter.Local
            CreateWorkflowOwnerCommand command)
        // ReSharper restore UnusedParameter.Local
        {

            try
            {
                context.BindInstanceOwner(_ownerId, _lockToken);
                return null;
            }
            catch(InstancePersistenceException exception)
            {
                Console.WriteLine(
                    // ReSharper disable LocalizableElement
                    "ProcessCreateWorkflowOwner exception: {0}",
                    // ReSharper restore LocalizableElement
                    exception.Message);
                return exception;
            }

        }
Exemple #14
0
        private static SqlWorkflowInstanceStore CreateInstanceStore(WorkflowHandlerBase workflowInstance)
        {
            var store = new SqlWorkflowInstanceStore(ConnectionString);
            var ownerHandle = store.CreateInstanceHandle();

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

            var ownerCommand =
                new CreateWorkflowOwnerCommand() { InstanceOwnerMetadata = { { WorkflowHostTypePropertyName, new InstanceValue(wfHostTypeName) } } };

            store.DefaultInstanceOwner = store.Execute(ownerHandle, ownerCommand, TimeSpan.FromSeconds(30)).InstanceOwner;
            return store;
        }