private static void StartSyncingConfig(ArtifactSyncJobConfig config) { var sourceMongoUrl = new MongoUrl(config.EventStoreConnectionString); var sourceDatabase = new MongoClient(sourceMongoUrl).GetDatabase(sourceMongoUrl.DatabaseName); var rmStream = sourceDatabase.GetCollection <BsonDocument>("Commits"); Int64 checkpoint = config.GetLastSyncedCheckpoint(); var syncUnit = new SyncUnit(new SyncUnitConfigurator()); while (true) { var files = rmStream .Find(Builders <BsonDocument> .Filter.Gte("_id", checkpoint)) .Sort(Builders <BsonDocument> .Sort.Ascending("_id")) .ToEnumerable(); foreach (var file in files) { BsonArray events = file["Events"].AsBsonArray; foreach (var evt in events) { var body = evt["Payload"]["Body"].AsBsonDocument; if (body.Names.Contains("BlobId")) { string fileId = body["BlobId"].AsString; syncUnit.Sync(fileId, config); } } var checkpointToken = file["_id"].AsInt64; checkpoint = checkpointToken + 1; config.SaveLastSyncedCheckpoint(checkpoint); } Console.WriteLine("No more commit to sync!!"); Thread.Sleep(2000); } }
internal static void StartSync() { //grab all tenants from configuration manager. Console.WriteLine("Reading data from configuration manager"); var tenants = ConfigurationServiceClient.Instance.GetStructuredSetting("tenants"); List <ArtifactSyncJobConfig> configs = new List <ArtifactSyncJobConfig>(); foreach (string tenantId in tenants) // conversion from dynamic array { Console.WriteLine("Looking for configuration for tenant {0}", tenantId); var artifactSyncJobConfig = new ArtifactSyncJobConfig(tenantId); var tenantOriginalConnectionStringSettingName = tenantId + "-dest-ori"; ConnectionStringSettings destinationConnectionOriginal = ConfigurationManager.ConnectionStrings[tenantOriginalConnectionStringSettingName]; var tenantArtifactsConnectionStringSettingName = tenantId + "-dest-art"; ConnectionStringSettings destinationConnectionArtifacts = ConfigurationManager.ConnectionStrings[tenantArtifactsConnectionStringSettingName]; if (destinationConnectionOriginal == null) { Console.WriteLine("Destination connection for original [{1}], tenant {0} not specified, tenant skipped", tenantId, tenantOriginalConnectionStringSettingName); continue; } if (destinationConnectionArtifacts == null) { Console.WriteLine("Destination connection for artifacts [{1}], tenant {0} not specified, tenant skipped", tenantId, tenantArtifactsConnectionStringSettingName); continue; } Console.WriteLine("Configuration for tenant {0} valid!", tenantId); Console.WriteLine("Destination db for tenant/Original {0}: {1}", tenantId, destinationConnectionOriginal.ConnectionString); Console.WriteLine("Destination db for tenant/Artifacts {0}: {1}", tenantId, destinationConnectionArtifacts.ConnectionString); Console.WriteLine("TENANT {0} sync started from checkpoint token {1}", tenantId, artifactSyncJobConfig.GetLastSyncedCheckpoint()); Console.Write("Do you want start syncronization for tenant {0} (s/n)?", tenantId); Char answer; do { answer = Console.ReadKey().KeyChar; } while (answer != 's' && answer != 'n'); if (answer == 's') { artifactSyncJobConfig.SetDestination(destinationConnectionOriginal.ConnectionString, destinationConnectionArtifacts.ConnectionString); configs.Add(artifactSyncJobConfig); } } Console.WriteLine("Press a key to start sync"); Console.ReadLine(); List <Task> tasks = new List <Task>(); foreach (var config in configs) { var task = Task.Factory.StartNew(() => StartSyncingConfig(config)); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); }