Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
        }