static void Main(string[] args) { ServicePointManager.DefaultConnectionLimit = 50; //(Or More) ThreadPool.SetMinThreads(50, 50); var destinationQueue = QueueClient.CreateFromConnectionString(InternalConfiguration.QueueConnectionString, "01PublisherToConsumer"); var storages = InternalConfiguration.Storages; Console.WriteLine("[{0}] Process Started", processId); do { try { var files = Directory.GetFiles(Environment.CurrentDirectory + "/xml"); Console.WriteLine($"Se agregan {files.Count()} archivos a procesar"); Parallel.ForEach(files, (currentFile) => { var guid = Guid.NewGuid().ToString(); Tuple <string, string> tuple; if (InternalConfiguration.EnableInLineXML) { tuple = new Tuple <string, string>(File.ReadAllText(currentFile), "inline"); } else { tuple = uploadAndGetStorageUri(guid, currentFile, storages); } CfdiFile file = new CfdiFile() { Guid = guid, FileName = currentFile, FileContent = tuple.Item1, FechaCreacion = DateTime.Now, Storage = tuple.Item2 }; try { destinationQueue.Send(new BrokeredMessage(file) { SessionId = file.Guid }); } catch (Exception ex) { Console.WriteLine(ex); } } ); } catch (Exception ex) { Console.WriteLine(ex); } } while (true); }
private static DataRow NewRow(DataTable facturasDataTable, CfdiFile cfdiFile) { DataRow row = facturasDataTable.NewRow(); row["Guid"] = cfdiFile.Guid; row["FileName"] = cfdiFile.FileName; row["FileContent"] = cfdiFile.FileContent; facturasDataTable.Rows.Add(row); return(row); }
static void Main(string[] args) { ServicePointManager.DefaultConnectionLimit = 50; //(Or More) ThreadPool.SetMinThreads(50, 50); var sourceQueue = QueueClient.CreateFromConnectionString(InternalConfiguration.QueueConnectionString, "02ConsumerToValidaRFC"); var destinationQueue = QueueClient.CreateFromConnectionString(InternalConfiguration.QueueConnectionString, "03ValidaRFCToSigner"); //DocumentDBRepository<Cfdi>.Initialize(); IDatabase cache = null; if (InternalConfiguration.EnableRedisCache) { Console.WriteLine("Redis Cache enabled"); cache = Connection.GetDatabase(); } var count = 0; do { try { Stopwatch swProcess = Stopwatch.StartNew(); var files = sourceQueue.ReceiveBatch(1000); count = files.Count(); Console.WriteLine(count); if (count > 0) { Parallel.ForEach(files, (currentFile) => { try { CfdiFile file = currentFile.GetBody <CfdiFile>(); var cfdi = new Cfdi(); if (file.Storage == "inline") { cfdi = new Cfdi(file.FileContent, file.Guid); } else { CloudStorageAccount storageAccount = CloudStorageAccount.Parse(file.Storage); CloudBlockBlob blob = new CloudBlockBlob(new Uri(file.FileContent), storageAccount.Credentials); var enableTableStorage = false; if (enableTableStorage) { CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); CloudTable table = tableClient.GetTableReference("cfdi"); TableOperation retrieveOperation = TableOperation.Retrieve <CfdiEntity>("none", file.Guid); TableResult retrievedResult = table.Execute(retrieveOperation); if (retrievedResult.Result != null) { var xml = ((CfdiEntity)retrievedResult.Result).Xml; cfdi = new Cfdi(xml, file.Guid); } } else { using (var stream = blob.OpenRead()) { cfdi = new Cfdi(stream, file.Guid); } } } if (InternalConfiguration.EnableRedisCache) { Stopwatch sw = Stopwatch.StartNew(); cfdi.ValidaRfcEmision(cache.StringGet(cfdi.RfcEmisor)); cfdi.ValidaRfcReceptor(cache.StringGet(cfdi.RfcReceptor)); cfdi.ValidationTimeSpend = sw.ElapsedMilliseconds; } //Guarda en Cosmos DB //DocumentDBRepository<Cfdi>.CreateItemAsync(cfdi).GetAwaiter().GetResult(); //Fin de guardado en cosmos destinationQueue.Send(new BrokeredMessage(new Tuple <CfdiFile, Cfdi>(file, cfdi)) { SessionId = file.Guid }); currentFile.Complete(); } catch (Exception ex) { Console.WriteLine(ex); currentFile.Abandon(); } } ); } if (swProcess.ElapsedMilliseconds > 1000) { Console.WriteLine($"-> [{count} / {swProcess.ElapsedMilliseconds / 1000}] = {count / (swProcess.ElapsedMilliseconds / 1000)} x segundo"); } } catch (Exception ex) { Console.WriteLine(ex); } if (count == 0) { Thread.Sleep(1000); } } while (true); }
static void Main(string[] args) { var sourceQueue = QueueClient.CreateFromConnectionString(InternalConfiguration.QueueConnectionString, "01PublisherToConsumer"); var destinationQueue = QueueClient.CreateFromConnectionString(InternalConfiguration.QueueConnectionString, "02ConsumerToValidaRFC"); var sqlconnectionstring = InternalConfiguration.SqlConnectionString; var count = 0; do { try { var files = sourceQueue.ReceiveBatch(1000); count = files.Count(); Console.WriteLine(count); if (count > 0) { if (InternalConfiguration.EnableSqlBulkInsert) { var returnvalue = MakeTable(files); var dataTable = returnvalue.Item1; using (var cnn = new SqlConnection(sqlconnectionstring)) { cnn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(cnn)) { bulkCopy.DestinationTableName = "dbo.Facturas"; try { bulkCopy.WriteToServer(dataTable); destinationQueue.SendBatch(returnvalue.Item2); sourceQueue.CompleteBatch(from f in files select f.LockToken); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } } else { Parallel.ForEach(files, (currentFile) => { try { CfdiFile file = currentFile.GetBody <CfdiFile>(); using (var cnn = new SqlConnection(sqlconnectionstring)) { cnn.Open(); using (var cmd = cnn.CreateCommand()) { cmd.CommandText = "INSERT INTO [dbo].[Facturas] ([Guid],[FileName],[FileContent]) VALUES (@Guid,@FileName,@FileContent)"; cmd.Parameters.AddWithValue("@Guid", file.Guid); cmd.Parameters.AddWithValue("@FileName", file.FileName); cmd.Parameters.AddWithValue("@FileContent", file.FileContent); cmd.ExecuteNonQuery(); } } currentFile.Complete(); } catch (Exception ex) { Console.WriteLine(ex); currentFile.Abandon(); } } ); } } } catch (Exception ex) { Console.WriteLine(ex); } if (count == 0) { Thread.Sleep(1000); } } while (true); }
private static Tuple <DataTable, List <BrokeredMessage> > MakeTable(IEnumerable <BrokeredMessage> messages) // Create a new DataTable named NewProducts. { DataTable facturasDataTable = new DataTable("Facturas"); List <BrokeredMessage> newqueue = new List <BrokeredMessage>(); // Add three column objects to the table. DataColumn id = new DataColumn() { DataType = System.Type.GetType("System.Int64"), ColumnName = "Id", AutoIncrement = true }; facturasDataTable.Columns.Add(id); DataColumn guid = new DataColumn() { DataType = System.Type.GetType("System.String"), ColumnName = "Guid" }; facturasDataTable.Columns.Add(guid); DataColumn fileName = new DataColumn() { DataType = System.Type.GetType("System.String"), ColumnName = "FileName" }; facturasDataTable.Columns.Add(fileName); DataColumn fileContent = new DataColumn() { DataType = System.Type.GetType("System.String"), ColumnName = "FileContent" }; facturasDataTable.Columns.Add(fileContent); // Create an array for DataColumn objects. DataColumn[] keys = new DataColumn[1]; keys[0] = id; facturasDataTable.PrimaryKey = keys; // Add some new rows to the collection. foreach (var item in messages) { CfdiFile file = item.GetBody <CfdiFile>(); NewRow(facturasDataTable, file); newqueue.Add(new BrokeredMessage(file) { SessionId = file.Guid }); } facturasDataTable.AcceptChanges(); // Return the new DataTable. return(new Tuple <DataTable, List <BrokeredMessage> >(facturasDataTable, newqueue)); }