Пример #1
0
        /// <summary>
        /// Create new instance of ProcessManager
        /// When multiple threads try to create new ProcessManager instance, only the first one is allowed.
        /// All subsequent threads will update data instead.
        /// </summary>
        /// <param name="data"></param>
        public void InsertData(IProcessManagerData data)
        {
            var collectionName = GetCollectionName(data);

            IMongoCollection <MongoDbSslData <IProcessManagerData> > collection = _mongoDatabase.GetCollection <MongoDbSslData <IProcessManagerData> >(collectionName);
            var indexOptions = new CreateIndexOptions();
            var indexKeys    = Builders <MongoDbSslData <IProcessManagerData> > .IndexKeys.Ascending("Data.CorrelationId");

            var indexModel = new CreateIndexModel <MongoDbSslData <IProcessManagerData> >(indexKeys, indexOptions);

            collection.Indexes.CreateOne(indexModel);

            var mongoDbData = new MongoDbSslData <IProcessManagerData>
            {
                Data    = data,
                Version = 1,
                //Id = Guid.NewGuid()
            };

            var filter = Builders <MongoDbSslData <IProcessManagerData> > .Filter.Eq("Data.CorrelationId", mongoDbData.Data.CorrelationId);

            collection.ReplaceOne(filter, mongoDbData, new ReplaceOptions {
                IsUpsert = true
            });
        }
        public void InsertData(IProcessManagerData data)
        {
            Type typeParameterType = data.GetType();

            MethodInfo md = GetType().GetTypeInfo().GetMethods().First(m => m.Name == "GetMemoryData" && m.GetParameters()[0].Name == "data");
            //MethodInfo genericMd = md.MakeGenericMethod(typeParameterType);
            MethodInfo genericMd = md.MakeGenericMethod(typeof(IProcessManagerData));

            lock (_memoryCacheLock)
            {
                var memoryData = genericMd.Invoke(this, new object[] { data });

                string key = data.CorrelationId.ToString();

                //if (!Cache.Contains(key))
                //{
                //    Cache.Set(key, memoryData, _policy);
                //}
                //else
                //{
                //    throw new ArgumentException(string.Format("ProcessManagerData with CorrelationId {0} already exists in the cache.", key));
                //}

                if (!_provider.Contains(key))
                {
                    _provider.Add(key, memoryData, _absoluteExpiry);
                }
                else
                {
                    throw new ArgumentException(string.Format("ProcessManagerData with CorrelationId {0} already exists in the cache.", key));
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Create new instance of ProcessManager
        /// When multiple threads try to create new ProcessManager instance, only the first one is allowed.
        /// All subsequent threads will update data instead.
        /// </summary>
        /// <param name="data"></param>
        public void InsertData(IProcessManagerData data)
        {
            var collectionName = GetCollectionName(data);

            MongoCollection collection = _mongoDatabase.GetCollection(collectionName);

            var mongoDbData = new MyMongoData <IProcessManagerData>
            {
                Data    = data,
                Version = 1,
                Id      = Guid.NewGuid(),
                Locked  = false
            };

            collection.FindAndModify(Query.EQ("CorrelationId", mongoDbData.Data.CorrelationId), SortBy.Null, Update.Replace(mongoDbData), false, true);
        }
Пример #4
0
 public void InsertData(IProcessManagerData data)
 {
     Finder.InsertData(data);
 }
 public void InsertData(IProcessManagerData data)
 {
 }
        /// <summary>
        /// Create new instance of ProcessManager
        /// When multiple threads try to create new ProcessManager instance, only the first one is allowed.
        /// All subsequent threads will update data instead.
        /// </summary>
        /// <param name="data"></param>
        public void InsertData(IProcessManagerData data)
        {
            string tableName = GetTableName(data);

            var sqlServerData = new SqlServerData <IProcessManagerData>
            {
                Data    = data,
                Version = 1,
                Id      = data.CorrelationId
            };

            var       xmlSerializer = new XmlSerializer(data.GetType());
            var       sww           = new StringWriter();
            XmlWriter writer        = XmlWriter.Create(sww);

            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            using (var sqlConnection = new SqlConnection(_connectionString))
            {
                sqlConnection.Open();

                using (var dbTransaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted))
                {
                    // Insert if doesn't exist, else update (only the first one is allowed)
                    string upsertSql = string.Format(@"if exists (select * from {0} with (updlock,serializable) WHERE Id = @Id)
                                                    begin
                                                        UPDATE {0}
		                                                SET DataXml = @DataXml, Version = @Version 
		                                                WHERE Id = @Id
                                                    end
                                                else
                                                    begin
                                                        INSERT {0} (Id, Version, DataXml)
                                                        VALUES (@Id,@Version,@DataXml)
                                                    end", tableName);


                    using (var command = new SqlCommand(upsertSql))
                    {
                        command.Connection  = sqlConnection;
                        command.Transaction = dbTransaction;
                        command.Parameters.Add("@Id", SqlDbType.UniqueIdentifier).Value = data.CorrelationId;
                        command.Parameters.Add("@Version", SqlDbType.Int).Value         = sqlServerData.Version;
                        command.Parameters.Add("@DataXml", SqlDbType.Xml).Value         = dataXml;

                        try
                        {
                            command.ExecuteNonQuery();
                            dbTransaction.Commit();
                        }
                        catch
                        {
                            dbTransaction.Rollback();
                            throw;
                        }
                        finally
                        {
                            sqlConnection.Close();
                        }
                    }
                }
            }
        }