/// <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)); } } }
/// <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); }
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(); } } } } }