public async Task <IActionResult> Produce([FromBody] string message)
        {
            await _producer.Produce(new TestProduceMessage
            {
                CreatedAt = DateTime.Now,
                Body      = message
            });

            return(Ok());
        }
        private async Task ReplicateDataToTopics()
        {
            _logger.LogInfo("Started replication of clusters");
            var prices = _prices.AsQueryable();

            foreach (var price in prices.ToEnumerable())
            {
                await _messageProducer.Produce(price.Id.ToString(), price);
            }
            _logger.LogInfo("Replication finished");
        }
Beispiel #3
0
        /// <summary>
        /// Calls the Produce() method in loop for high throughput scenarios
        /// </summary>
        /// <param name="producer"></param>
        /// <param name="items">All messages to produce</param>
        /// <param name="throwIfAnyProduceFail">indicates if the method should throw a <see cref="BatchProduceException"/> if any message fail</param>
        /// <returns>A Task that will be marked as completed when all produce operations end</returns>
        public static Task <IReadOnlyCollection <BatchProduceItem> > BatchProduceAsync(
            this IMessageProducer producer,
            IReadOnlyCollection <BatchProduceItem> items,
            bool throwIfAnyProduceFail = true)
        {
            var completionSource = new TaskCompletionSource <IReadOnlyCollection <BatchProduceItem> >();

            var pendingProduceCount = items.Count;
            var hasErrors           = false;

            if (pendingProduceCount == 0)
            {
                completionSource.SetResult(items);
            }

            foreach (var item in items)
            {
                producer.Produce(
                    item.Topic,
                    item.PartitionKey,
                    item.Message,
                    item.Headers,
                    report =>
                {
                    item.DeliveryReport = report;

                    if (report.Error.IsError)
                    {
                        hasErrors = true;
                    }

                    if (Interlocked.Decrement(ref pendingProduceCount) != 0)
                    {
                        return;
                    }

                    if (throwIfAnyProduceFail && hasErrors)
                    {
                        completionSource.SetException(new BatchProduceException(items));
                    }
                    else
                    {
                        completionSource.SetResult(items);
                    }
                });
            }

            return(completionSource.Task);
        }
Beispiel #4
0
        public CreateMemberResponse CreateMember(CreateMemberRequest request)
        {
            _validator.ValidateRequest(request);

            var member = Member.New();

            member.SetMemberInformation(request.Name, request.Surname, request.Email);
            _memberManager.Save(member);
            _messageProducer.Produce("member-event", member.ID.ToString());
            return(new CreateMemberResponse()
            {
                MemberId = member.ID,
                Name = member.Name,
                Surname = member.Surname,
                Email = member.Email
            });
        }
Beispiel #5
0
        protected override async Task ProcessRecord(string key, Product value)
        {
            value.Rating  = value.Rating.Unify();
            value.Reviews = value.Reviews.Select(r =>
                                                 new Review()
            {
                Liked    = r.Liked,
                Disliked = r.Disliked,
                Text     = r.Text,
                Note     = r.Note.Unify()
            });

            value.Properties = value.Properties.ToDictionary(p => p.Key.Replace('.', '_'), p => p.Value);

            await _productsRepository.Upsert(value);

            await _clusterizationProducer.Produce(value);
        }
Beispiel #6
0
        async static Task ProcessPage(IBrowsingContext context, string category, string url)
        {
            try
            {
                IRatingParser  ratingParser  = new CitilinkRatingParser();
                IProductParser productParser = new CitilinkProductParser();

                Product product = new Product();
                product.Url = url;
                using (var document = await context.OpenAsync(url))
                {
                    product.ProductType = category;
                    product.Name        = productParser.ParseName(document);
                    product.Rating      = ratingParser.Parse(document);
                    product.Price       = productParser.ParsePrice(document);
                    product.Properties  = productParser.ParseProperties(document);
                }

                product.Reviews = await ProcessReviews(context, $"{url}/otzyvy/", ratingParser);

                Console.WriteLine($"Product {product.Name} has been parsed");

                await s_producer.Produce(product.Name, product);

                // To Prevent being blocked
                await Task.Delay(s_random.Next(30000, 45000));
            }
            catch (NullReferenceException ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex);
                Console.ForegroundColor = ConsoleColor.White;
                // we got captcha wait an hour
                await Task.Delay(4000000);
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex);
                Console.ForegroundColor = ConsoleColor.White;
            }
        }
Beispiel #7
0
        static async Task GenerateProduct(Random r, string category, string url, int i)
        {
            Product product = new Product();

            product.Url         = $"{url}{i}";
            product.ProductType = category;
            product.Name        = $"{category} v{i}";
            product.Rating      = new Rating(r.Next(11), 10);
            product.Price       = new Price()
            {
                Currency = "BLR",
                Value    = r.Next(200, 4000)
            };
            product.Properties = new Dictionary <string, string>()
            {
                { "tp1", "test property we've just created" }
            };

            product.Reviews = ProcessReviews(r);
            await s_producer.Produce(product.Name, product);
        }
Beispiel #8
0
 protected void Register(IMessageConsumer consumer, IMessageProducer producer)
 {
     consumer.Consume(producer.Produce());
     _store.Add(consumer, producer);
 }
        public override async Task Handle(ProductUpdatedIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _messageProducer.Produce(notification);

            _logger.LogInformation($"O Produto {notification.Name} de id = {notification.Id} foi atualizado e enviado para a api de products");
        }
        public override async Task Handle(OrderCreatedIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _messageProducer.Produce(notification);

            _logger.LogInformation($"Pedido de confirmação de estoque enviado para a ordem {notification.OrderId}");
        }
        public override async Task Handle(OrderRollbackIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _messageProducer.Produce(notification);

            _logger.LogInformation($"Mensagem de rollback enviada para a api de prodtos, ordem = {notification.OrderId}");
        }
Beispiel #12
0
        public async Task <IActionResult> CheckoutBasket([FromBody] BasketCheckout basketCheckout)
        {
            try
            {
                var entity = await _dbContext
                             .Baskets
                             .Include(basket => basket.BasketLines)
                             .Where(basket => basket.Id == basketCheckout.BasketId)
                             .FirstOrDefaultAsync()
                ;

                if (entity == null)
                {
                    return(BadRequest()); // not NotFound()
                }
                //var userId = HttpContext.Request.Headers["CurrentUser"].FirstOrDefault(); // basketCheckout.UserId;
                var userId = User.GetClaimOrDefault <string>("sub");
                if (!userId.IsValidDbStringId())
                {
                    return(BadRequest("No Valid 'CurrentUser' Header exists"));
                }

                var basketCheckoutMessage = BasketCheckoutMessageMapper.From(basketCheckout, userId);
                basketCheckoutMessage
                .BasketLines
                .AddRange(entity
                          .BasketLines
                          .Select(line =>
                                  new BasketLineMessage()
                {
                    Price        = line.Price,
                    TicketAmount = line.TicketAmount,
                    BasketLineId = line.Id,
                }
                                  )
                          );

                int totalPrice =
                    basketCheckoutMessage
                    .BasketLines
                    .Sum(lineMessage =>
                         lineMessage.Price * lineMessage.TicketAmount
                         );

                // Discount서버를 통해 할인 적용.
                var coupon = userId.IsValidDbStringId() ? await _discountService.GetCouponAsync(userId) : null;

                var couponAmount = coupon?.Amount ?? 0;

                // 지불금액
                basketCheckoutMessage.BasketTotal = totalPrice - couponAmount;

                // 다른 서비스(~= Order Service) 에 Checkout 되었음을 통지.
                await _producer.Produce(basketCheckoutMessage);

                // 처리된 Basket 을 삭제.
                var basketsToRemove = _dbContext.Baskets.Where(basket => basket.Id == basketCheckout.BasketId);
                _dbContext.Baskets.RemoveRange(basketsToRemove);
                await _dbContext.SaveChangesAsync();

                return(Ok(basketCheckoutMessage));
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e.StackTrace));
            }
        }
        public override async Task Handle(StockConfirmationIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _producer.Produce(notification);

            _logger.LogInformation($"Confirmação de estoque Bem sucedida enviada para a ordem {notification.OrderId}");
        }
Beispiel #14
0
        public override async Task Handle(StockUpdateIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _producer.Produce(notification);

            _logger.LogInformation($"Atualização de estoque enviada para a manger deviado a execução da ordem {notification.OrderId}");
        }
        public override async Task Handle(ProductRollbackIntegrationEvent notification, CancellationToken cancellationToken)
        {
            await _producer.Produce(notification);

            _logger.LogInformation("Rollback de estoque de produtos devido a erro na ordem enviado para a manager");
        }